JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<<nobr>> <<set $maxTraits = 1>> /* Initialize default name values if not already set */ <<if $firstName === undefined or $firstName === "">> <<set $firstName = "Water">> <</if>> <<if $lastName === undefined or $lastName === "">> <<set $lastName = "Bottle">> <</if>> /* Initialize appearance object if it doesn't exist */ <<if !$appearance>> <<set $appearance = { skinTone: "pale", hairColor: "Black", hairStyle: "messy", physique: "average", age: "Adult" }>> <</if>> /* Initialize bodyParts if not set */ <<if !$bodyParts>> <<set $bodyParts = { gender: "male", chest: "flat masculine", butt: "flat masculine" }>> <</if>> /* Initialize playerPronouns if not set */ <<if !$playerPronouns>> <<set $playerPronouns = "he/him">> <</if>> /* Clear the returning flag after loading */ <<if $returningFromSummary>> <<set $returningFromSummary = false>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🎨 Character Creation</h1> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> Create your character for Sunfish City. Customize your appearance and select starting traits. </p> </div> <!-- Basic Information --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #667eea; padding-bottom: 10px;">👤 Basic Information</h2> <div style="margin-bottom: 20px;"> <label style="color: #aaa; font-size: 16px; display: block; margin-bottom: 8px; font-weight: bold;">First Name:</label> <<textbox "$firstName" $firstName autofocus>> </div> <div style="margin-bottom: 0;"> <label style="color: #aaa; font-size: 16px; display: block; margin-bottom: 8px; font-weight: bold;">Last Name:</label> <<textbox "$lastName" $lastName>> </div> </div> <!-- Pronouns --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">💬 Pronouns</h2> <div style="display: flex; gap: 20px; align-items: center; flex-wrap: wrap;"> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $playerPronouns === "he/him">> <<radiobutton "$playerPronouns" "he/him" checked>> <<else>> <<radiobutton "$playerPronouns" "he/him">> <</if>> He/Him </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $playerPronouns === "she/her">> <<radiobutton "$playerPronouns" "she/her" checked>> <<else>> <<radiobutton "$playerPronouns" "she/her">> <</if>> She/Her </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $playerPronouns === "they/them">> <<radiobutton "$playerPronouns" "they/them" checked>> <<else>> <<radiobutton "$playerPronouns" "they/them">> <</if>> They/Them </label> <<link "<span style='color: #9b59b6; font-weight: bold; font-size: 16px;'>Customize</span>">> <<pronouns>> <</link>> </div> </div> <!-- Gender --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">⚧ Gender</h2> <div style="display: flex; gap: 20px; flex-wrap: wrap;"> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $bodyParts.gender === "male">> <<radiobutton "$bodyParts.gender" "male" checked>> <<else>> <<radiobutton "$bodyParts.gender" "male">> <</if>> Male </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $bodyParts.gender === "female">> <<radiobutton "$bodyParts.gender" "female" checked>> <<else>> <<radiobutton "$bodyParts.gender" "female">> <</if>> Female </label> </div> </div> <!-- Appearance --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">✨ Appearance</h2> <div style="margin-bottom: 20px;"> <h3 style="color: #aaa; margin: 0 0 10px 0; font-size: 18px;">Skin Tone:</h3> <div style="display: flex; gap: 20px; flex-wrap: wrap;"> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.skinTone === "pale">> <<radiobutton "$appearance.skinTone" "pale" checked>> <<else>> <<radiobutton "$appearance.skinTone" "pale">> <</if>> Pale </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.skinTone === "tan">> <<radiobutton "$appearance.skinTone" "tan" checked>> <<else>> <<radiobutton "$appearance.skinTone" "tan">> <</if>> Tan </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.skinTone === "dark">> <<radiobutton "$appearance.skinTone" "dark" checked>> <<else>> <<radiobutton "$appearance.skinTone" "dark">> <</if>> Dark </label> </div> </div> <div style="margin-bottom: 20px;"> <h3 style="color: #aaa; margin: 0 0 10px 0; font-size: 18px;">Hair Color:</h3> <div style="display: flex; gap: 20px; flex-wrap: wrap;"> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.hairColor === "Black" || !$appearance.hairColor>> <<radiobutton "$appearance.hairColor" "Black" checked>> <<else>> <<radiobutton "$appearance.hairColor" "Black">> <</if>> Black </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.hairColor === "Brown">> <<radiobutton "$appearance.hairColor" "Brown" checked>> <<else>> <<radiobutton "$appearance.hairColor" "Brown">> <</if>> Brown </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.hairColor === "Blonde">> <<radiobutton "$appearance.hairColor" "Blonde" checked>> <<else>> <<radiobutton "$appearance.hairColor" "Blonde">> <</if>> Blonde </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.hairColor === "Red">> <<radiobutton "$appearance.hairColor" "Red" checked>> <<else>> <<radiobutton "$appearance.hairColor" "Red">> <</if>> Red </label> </div> </div> <div style="margin-bottom: 0;"> <h3 style="color: #aaa; margin: 0 0 10px 0; font-size: 18px;">Age:</h3> <div style="display: flex; gap: 20px; flex-wrap: wrap;"> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.age === "Adult">> <<radiobutton "$appearance.age" "Adult" checked>> <<else>> <<radiobutton "$appearance.age" "Adult">> <</if>> Adult </label> <label style="color: #ccc; font-size: 16px; cursor: pointer;"> <<if $appearance.age === "Mature Adult">> <<radiobutton "$appearance.age" "Mature Adult" checked>> <<else>> <<radiobutton "$appearance.age" "Mature Adult">> <</if>> Mature Adult </label> </div> </div> </div> <!-- Starting Options --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #51cf66; padding-bottom: 10px;">🎁 Starting Options</h2> <p style="color: #aaa; font-size: 16px; margin: 0 0 15px 0;"> <strong>Optional:</strong> Select one starting benefit (or none). </p> <span id="starting-option-counter"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"> <p style="color: #51cf66; margin: 0; font-size: 16px; font-weight: bold;"> You have currently chosen <span style="color: #ffc107;"><<if $startingOption>>1<<else>>0<</if>></span> out of 1 starting option. </p> </div> </span> <span id="starting-options-list"> <<include "StartingOptionsDisplay">> </span> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 18px 50px; border-radius: 12px; font-weight: bold; font-size: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue to Summary →</div>">> /* Initialize trait objects and jobs FIRST before doing anything else */ <<if !$traits>> <<set $traits = {}>> <</if>> <<if !$physicalTraits>> <<set $physicalTraits = []>> <</if>> <<if !$skills>> <<set $skills = []>> <</if>> /* Auto-set chest, butt, and genitals based on gender */ <<if $bodyParts.gender === "male">> <<set $bodyParts.chest = "flat masculine">> <<set $bodyParts.butt = "flat masculine">> <<set $bodyParts.genitals = "small penis">> <<else>> <<set $bodyParts.chest = "flat">> <<set $bodyParts.butt = "flat">> <<set $bodyParts.genitals = "tight vagina">> <</if>> /* Ensure hair style is set to messy */ <<set $appearance.hairStyle = "messy">> /* Initialize hair length as short by default and add to physical traits */ <<set $appearance.hairLength = "short">> <<if !$physicalTraits.includes("Short Hair")>> <<run $physicalTraits.push("Short Hair")>> <</if>> /* Set all stats to 5 */ <<set $stats = { charisma: 5, dexterity: 5, strength: 5, intelligence: 5 }>> /* Set max stat caps to 100 */ <<set $statMaxCaps = { charisma: 999, dexterity: 999, strength: 999, intelligence: 999 }>> /* Set pronouns based on selection */ <<if $playerPronouns === "she/her">> <<run setup.gender.setPronouns("female")>> <<elseif $playerPronouns === "he/him">> <<run setup.gender.setPronouns("male")>> <<elseif $playerPronouns === "they/them">> <<run setup.gender.setPronouns("they")>> <</if>> /* Initialize jobs array as empty (unemployed) */ <<set $jobs = []>> <<set $homeless = true>> /* Handle starting option */ <<if $startingOption>> /* Dock Worker */ <<if $startingOption === "Dock Worker">> <<set $jobs = ["Dock Worker"]>> <<set $homeless = false>> <<if !$physicalTraits.includes("Athletic Build")>> <<run $physicalTraits.push("Athletic Build")>> <</if>> /* Barista */ <<elseif $startingOption === "Barista">> <<set $jobs = ["Barista"]>> <<set $homeless = false>> <<set $traits["Energetic"] = true>> /* Beauty Salon Stylist */ <<elseif $startingOption === "Beauty Salon Stylist">> <<set $jobs = ["Beauty Salon Stylist"]>> <<set $homeless = false>> <<if !$skills.includes("Hair Styling")>> <<run $skills.push("Hair Styling")>> <</if>> /* Curvy */ <<elseif $startingOption === "Curvy">> <<set $bodyParts.chest = "medium">> <<set $bodyParts.butt = "medium">> <<if !$physicalTraits.includes("Curvy")>> <<run $physicalTraits.push("Curvy")>> <</if>> /* Starting Funds */ <<elseif $startingOption === "Starting Funds">> <<set $money = ($money || 0) + 1500>> /* Quick Learner */ <<elseif $startingOption === "Quick Learner">> <<if !$skills.includes("Quick Learner")>> <<run $skills.push("Quick Learner")>> <</if>> <</if>> <</if>> /* Convert $traits object to $mentalTraits array */ <<if !$mentalTraits>> <<set $mentalTraits = []>> <</if>> <<for _traitName, _traitValue range $traits>> <<if _traitValue === true && !$mentalTraits.includes(_traitName)>> <<run $mentalTraits.push(_traitName)>> <</if>> <</for>> <<set $maxTraits = 100>> <<goto "Summary">> <</link>> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 40px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center; max-width: 600px;"> <h1 style="color: white; margin: 0 0 20px 0; font-size: 36px;">👋 Thank You for Playing</h1> <p style="color: white; margin: 0; font-size: 18px;"> That was supposed to kick you but if you still see this just close the game manually. </p> </div> <<script>> // Close the window/tab window.close(); // If window.close() doesn't work (blocked by browser), redirect to a blank page setTimeout(function() { window.location.href = "about:blank"; }, 1000); <</script>> <p style="color: #aaa; text-align: center; font-size: 14px; margin-top: 20px;"> If the window does not close automatically, you can safely close this tab. </p> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">📋 Character Summary</h1> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> Are you ready to begin your journey? </p> </div> <!-- Name --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #667eea; padding-bottom: 10px;">👤 Name</h2> <p style="color: #ccc; font-size: 20px; margin: 0; font-weight: bold;">$firstName $lastName</p> </div> <!-- Appearance --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">✨ Appearance</h2> <ul style="list-style-type: none; padding-left: 0; margin: 0;"> <li style="color: #ccc; font-size: 16px; margin-bottom: 10px;"> <strong style="color: #17a2b8;">Hair:</strong> <<set _summaryHairStyle = $appearance.hairStyle === "messy" ? "Messy " : "">> <<set _summaryHairLength = $appearance.hairLength ? $appearance.hairLength.toUpperFirst() : "Short">> <<print _summaryHairStyle + _summaryHairLength>> $appearance.hairColor </li> <li style="color: #ccc; font-size: 16px; margin-bottom: 10px;"> <strong style="color: #17a2b8;">Skin Tone:</strong> <<print $appearance.skinTone.toUpperFirst()>> </li> <li style="color: #ccc; font-size: 16px; margin-bottom: 10px;"> <strong style="color: #17a2b8;">Age:</strong> $appearance.age </li> <li style="color: #ccc; font-size: 16px; margin: 0;"> <strong style="color: #17a2b8;">Gender:</strong> <<print $bodyParts.gender.toUpperFirst()>> </li> </ul> </div> <!-- Body Parts --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">🫀 Body Parts</h2> <ul style="list-style-type: none; padding-left: 0; margin: 0;"> <li style="color: #ccc; font-size: 16px; margin-bottom: 10px;"> <strong style="color: #ff6b6b;">Chest:</strong> <<print $bodyParts.chest.toUpperFirst()>> </li> <li style="color: #ccc; font-size: 16px; margin-bottom: 10px;"> <strong style="color: #ff6b6b;">Butt:</strong> <<print $bodyParts.butt.toUpperFirst()>> </li> <li style="color: #ccc; font-size: 16px; margin: 0;"> <strong style="color: #ff6b6b;">Genitals:</strong> <<print $bodyParts.genitals.toUpperFirst()>> </li> </ul> </div> <!-- Current Job --> <<if $jobs && $jobs.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #667eea; padding-bottom: 10px;">💼 Current Job</h2> <p style="color: #ccc; font-size: 18px; margin: 0;"><<print $jobs[0]>></p> </div> <</if>> <!-- Physical Traits --> <<if $physicalTraits.length > 0>> <<set _displaySummaryPhysicalTraits = $physicalTraits.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair"; })>> <<if _displaySummaryPhysicalTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h2> <ul style="list-style-type: none; padding-left: 0; margin: 0;"> <<for _i to 0; _i < _displaySummaryPhysicalTraits.length; _i++>> <li style="color: #ccc; font-size: 16px; margin-bottom: 8px;">• <<print _displaySummaryPhysicalTraits[_i]>></li> <</for>> </ul> </div> <</if>> <</if>> <!-- Mental Traits --> <<if $mentalTraits && $mentalTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h2> <ul style="list-style-type: none; padding-left: 0; margin: 0;"> <<for _i to 0; _i < $mentalTraits.length; _i++>> <li style="color: #ccc; font-size: 16px; margin-bottom: 8px;">• <<print $mentalTraits[_i]>></li> <</for>> </ul> </div> <</if>> <!-- Skills --> <<if $skills && $skills.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h2> <ul style="list-style-type: none; padding-left: 0; margin: 0;"> <<for _i to 0; _i < $skills.length; _i++>> <li style="color: #ccc; font-size: 16px; margin-bottom: 8px;">• <<print $skills[_i]>></li> <</for>> </ul> </div> <</if>> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 30px;"> <<link "<div style='background: #51cf66; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>✅ Begin Game</div>">> <<set $skipTimeAdvancement = true>> <<goto "Alleyway">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>← Back to Character Creation</div>">> <<set $returningFromSummary = true>> <!-- Reset all character creation selections --> <<set $physicalTraits = []>> <<set $mentalTraits = []>> <<set $skills = []>> <<set $characterCreationTrait = null>> <!-- Reset money --> <<set $money = 0>> <!-- Reset stats to base values --> <<set $stats = { strength: 5, dexterity: 5, intelligence: 5, charisma: 5 }>> <!-- Reset body parts to defaults if needed --> <<if !$bodyParts.gender || !$bodyParts.chest || !$bodyParts.butt || !$bodyParts.genitals>> <<set $bodyParts = { gender: "male", chest: "flat", butt: "average", genitals: "penis" }>> <</if>> <!-- Reset appearance to defaults if needed --> <<if !$appearance.hairColor || !$appearance.skinTone>> <<set $appearance = { hairColor: "brown", hairLength: "short", hairStyle: "messy", skinTone: "pale", age: "Adult" }>> <</if>> <!-- Reset job if one was selected --> <<set $jobs = []>> <<goto "CharacterCreation">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Time and Date Display --> <<set _currentTime = getTimeOfDay()>> <div style="text-align: center; margin-bottom: 10px;"> <<if _currentTime === "morning">> <span style="font-size: 14px; font-weight: bold;">🌅 Morning</span> <<elseif _currentTime === "afternoon">> <span style="font-size: 14px; font-weight: bold;">☀️ Afternoon</span> <<elseif _currentTime === "evening">> <span style="font-size: 14px; font-weight: bold;">🌆 Evening</span> <<else>> <span style="font-size: 18px;">🌙 Night</span> <</if>> <br> <span style="font-size: 14px; font-weight: bold;">$dayOfWeek, Week $weekNumber</span> <br> <span style="font-size: 12px;"><<= getTimeString()>> - Day $dayNumber</span> </div> <!-- Player Name --> <div style="text-align: center; margin-bottom: 10px;"> <<if $firstName !== undefined && $lastName !== undefined>> <h2 style="color: #667eea; margin: 0;">$firstName $lastName</h2> <<else>> <h2 style="color: #667eea; margin: 0;">Water Bottle</h2> <</if>> </div> <!-- Character Portrait --> <div style="margin: 15px 0; text-align: center;"> <<if $appearance && $bodyParts>> <<set _faceImagePath = setup.getPlayerFaceImage()>> <<if _faceImagePath && _faceImagePath !== "">> <img @src="_faceImagePath" style="max-width: 100%; height: auto; border-radius: 10px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.2);" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; display: none; align-items: center; justify-content: center; color: white; font-style: italic; border: 3px solid #667eea;"> No Portrait </div> <<else>> <div style="width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: white; font-style: italic; border: 3px solid #667eea;"> No Portrait </div> <</if>> <<else>> <div style="width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: white; font-style: italic; border: 3px solid #667eea;"> No Portrait </div> <</if>> </div> <!-- Stats Overview --> <div style="margin: 10px 0;"> <h3 style="margin: 5px 0; color: #667eea; font-size: 16px;">Stats</h3> <div style="font-size: 12px;"> <<set _totalStrength = setup.getTotalStat("strength")>> <<set _totalIntelligence = setup.getTotalStat("intelligence")>> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _totalDexterity = setup.getTotalStat("dexterity")>> <<set _strengthBonus = _totalStrength - $stats.strength>> <<set _intelligenceBonus = _totalIntelligence - $stats.intelligence>> <<set _charismaBonus = _totalCharisma - $stats.charisma>> <<set _dexterityBonus = _totalDexterity - $stats.dexterity>> <strong>Strength:</strong> $stats.strength<<if _strengthBonus > 0>> <span style="color: #51cf66;">(+<<print _strengthBonus>>)</span><<elseif _strengthBonus < 0>> <span style="color: #ff6b6b;">(<<print _strengthBonus>>)</span><</if>><br> <strong>Intelligence:</strong> $stats.intelligence<<if _intelligenceBonus > 0>> <span style="color: #51cf66;">(+<<print _intelligenceBonus>>)</span><<elseif _intelligenceBonus < 0>> <span style="color: #ff6b6b;">(<<print _intelligenceBonus>>)</span><</if>><br> <strong>Charisma:</strong> $stats.charisma<<if _charismaBonus > 0>> <span style="color: #51cf66;">(+<<print _charismaBonus>>)</span><<elseif _charismaBonus < 0>> <span style="color: #ff6b6b;">(<<print _charismaBonus>>)</span><</if>><br> <strong>Dexterity:</strong> $stats.dexterity<<if _dexterityBonus > 0>> <span style="color: #51cf66;">(+<<print _dexterityBonus>>)</span><<elseif _dexterityBonus < 0>> <span style="color: #ff6b6b;">(<<print _dexterityBonus>>)</span><</if>><br> </div> </div> <!-- Quick Info --> <div style="margin: 10px 0;"> <h3 style="margin: 5px 0; color: #667eea; font-size: 16px;">Info</h3> <div style="font-size: 12px;"> <strong>Gender:</strong> <<print $bodyParts.gender.toUpperFirst()>><br> <strong>Skin:</strong> <<print $appearance.skinTone.toUpperFirst()>><br> <strong>Age:</strong> $appearance.age<br> <<if $jobs && $jobs.length > 0>> <strong>Job:</strong> <<print $jobs[0]>> <<else>> <strong>Job:</strong> <span style="color: #e74c3c;">Unemployed</span> <</if>><br> <strong>Money:</strong> <<print setup.formatMoney($money)>> </div> </div> <</nobr>>
:: Widgets [widget nobr] /* --- Custom textbox widget for reliable name input --- */ <<widget "ctext">> <<set _varName = _args[0]>> <<set _defaultValue = State.getVar(_varName) || "">> <<textbox _varName _defaultValue>> <</widget>> /* --- Trait Selection Widget --- */ <<widget "traitSelection">> <<for _name, _desc range $availableTraits>> <<capture _name, _desc>> <div style="margin-bottom: 8px;"> ''<<= _name>>'' <<if $selectedTraits.includes(_name)>> <span style="color: green;">(SELECTED)</span> <<link "REMOVE">> <<set $selectedTraits.delete(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <<if $selectedTraits.length < $maxTraits>> <<link "SELECT">> <<set $selectedTraits.push(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <span style="color: gray;">(Max Reached)</span> <</if>> <</if>> <br> <span style="font-size: 90%; color: #888888;"><<= _desc>></span> </div> <</capture>> <</for>> <</widget>> /* --- Continue Check Widget --- */ <<widget "continueCheck">> <<set _disable = $firstName === "" || $lastName === "">> <<disable _disable>> <<link "Continue to Stats">> <<set $stats = clone($baseStats)>> <<if $selectedTraits.length > 0>> <<for _i to 0; _i < $selectedTraits.length; _i++>> <<if $selectedTraits[_i] === "Pensive">> <<set $stats.intelligence += 3>> <<elseif $selectedTraits[_i] === "Silver-Tongued">> <<set $stats.charisma += 3>> <<elseif $selectedTraits[_i] === "Swift">> <<set $stats.dexterity += 3>> <<elseif $selectedTraits[_i] === "Jock">> <<set $stats.strength += 3>> <<elseif $selectedTraits[_i] === "Naturally Gifted">> <<set $stats.charisma += 2>> <<set $stats.dexterity += 2>> <<set $stats.strength += 2>> <<set $stats.intelligence += 2>> <<elseif $selectedTraits[_i] === "Quick Learner">> /* No stat effect - skill learning bonus only */ <</if>> <</for>> <</if>> <<set $maxTraits = 300>> <<goto "StatMenu">> <</link>> <</disable>> <<if _disable>> <br> <span style="color: red;">Please complete your name to continue.</span> <</if>> <</widget>>
:: CodeLibrary [widget nobr] <<widget "traitSelection">> <<for _name, _desc range $availableTraits>> <<capture _name, _desc>> <div style="margin-bottom: 8px;"> ''<<= _name>>'' <<if $selectedTraits.includes(_name)>> <span style="color: green;">(SELECTED)</span> <<link "REMOVE">> <<set $selectedTraits.delete(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <<if $selectedTraits.length < $maxTraits>> <<link "SELECT">> <<set $selectedTraits.push(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <span style="color: gray;">(Max Reached)</span> <</if>> <</if>> <br> <span style="font-size: 90%; color: #888888;"><<= _desc>></span> </div> <</capture>> <</for>> <</widget>> <<widget "continueCheck">> <<set _disable = $firstName === "" || $lastName === "">> <<disable _disable>> <<link "Continue to Traits">> <<set $stats = clone($baseStats)>> <<if $selectedTraits.length > 0>> <<for _i to 0; _i < $selectedTraits.length; _i++>> <<if $selectedTraits[_i] === "Pensive">> <<set $stats.intelligence += 5>> <<elseif $selectedTraits[_i] === "Silver-Tongued">> <<set $stats.charisma += 5>> <<elseif $selectedTraits[_i] === "Jock">> <<set $stats.strength += 5>> <<set $stats.intelligence -= 1>> <<elseif $selectedTraits[_i] === "Naturally Gifted">> <<goto "GiftedStatChoice">> <<elseif $selectedTraits[_i] === "Quick Learner" || $selectedTraits[_i] === "Keen Observer">> /* No stat effect needed, continue normally */ <</if>> <</for>> <</if>> <<set $maxTraits = 100>> <<goto "StatMenu">> <</link>> <</disable>> <<if _disable>> <br> <span style="color: red;">Please complete your name to continue.</span> <</if>> <</widget>> :: Widgets [widget] /* --- Custom textbox widget for reliable name input --- */ <<widget "ctext">> <<set _varName = _args[0]>> <<set _defaultValue = State.getVar(_varName) || "">> <<textbox _varName _defaultValue>> <</widget>> <<widget "traitSelection">> <<for _name, _desc range $availableTraits>> <<capture _name, _desc>> <div style="margin-bottom: 8px;"> ''<<= _name>>'' <<if $selectedTraits.includes(_name)>> <span style="color: green;">(SELECTED)</span> <<link "REMOVE">> <<set $selectedTraits.delete(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <<if $selectedTraits.length < $maxTraits>> <<link "SELECT">> <<set $selectedTraits.push(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <span style="color: gray;">(Max Reached)</span> <</if>> <</if>> <br> <span style="font-size: 90%; color: #888888;"><<= _desc>></span> </div> <</capture>> <</for>> <</widget>> <<widget "continueCheck">> <<set _disable = $firstName === "" || $lastName === "">> <<disable _disable>> <<link "Continue to Traits">> <<set $stats = clone($baseStats)>> <<if $selectedTraits.length > 0>> <<for _i to 0; _i < $selectedTraits.length; _i++>> <<if $selectedTraits[_i] === "Pensive">> <<set $stats.intelligence += 5>> <<elseif $selectedTraits[_i] === "Silver-Tongued">> <<set $stats.charisma += 5>> <<elseif $selectedTraits[_i] === "Jock">> <<set $stats.strength += 5>> <<set $stats.intelligence -= 1>> <<elseif $selectedTraits[_i] === "Naturally Gifted">> <<goto "GiftedStatChoice">> <<elseif $selectedTraits[_i] === "Quick Learner" || $selectedTraits[_i] === "Keen Observer">> /* No stat effect needed, continue normally */ <</if>> <</for>> <</if>> <<set $maxTraits = 100>> <<goto "StatMenu">> <</link>> <</disable>> <<if _disable>> <br> <span style="color: red;">Please complete your name to continue.</span> <</if>> <</widget>>
<<nobr>> <<set $lastLocation = "Alleyway">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #666; text-align: center;">🌆 Dark Alleyway</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Alley.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Dark Alleyway"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #434343 0%, #000000 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #666;"> <p style="color: white; font-size: 18px; margin: 0;"> You find yourself in a dimly lit alleyway in Sunfish City. The city sprawls around you, full of possibilities and dangers. Neon signs flicker in the distance, and the sounds of urban life echo off the grimy walls. </p> <<if $homeless>> <p style="color: #ff6b6b; margin: 10px 0 0 0; font-style: italic;"> You are homeless. You need to find work, shelter, or a way to change your circumstances. </p> <</if>> </div> <h2 style="color: #666;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">The heart of the city, bustling with activity.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Corporate towers and professional opportunities.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Neon lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- Shady Shop --> <div style="border: 3px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff4444; margin: 0 0 10px 0;">🕶️ Shady Shop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">A suspicious storefront with unmarked goods.</p> <<link "<div style='background: #ff4444; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Shady Shop</div>">> <<goto "ShadyShop">> <</link>> </div> </div> <!-- Unemployed NPCs Section --> <<set _unemployedNPCs = []>> <<for _npc range $npcs>> <<set _isUnemployed = false>> <<if !_npc.jobs || _npc.jobs.length === 0>> <<set _isUnemployed = true>> <<elseif typeof _npc.jobs === "string" && _npc.jobs === "Unemployed">> <<set _isUnemployed = true>> <<elseif Array.isArray(_npc.jobs) && (_npc.jobs.length === 0 || (_npc.jobs.length === 1 && _npc.jobs[0] === "Unemployed"))>> <<set _isUnemployed = true>> <</if>> <<if _isUnemployed>> <<run _unemployedNPCs.push(_npc)>> <</if>> <</for>> <<if _unemployedNPCs.length > 0>> <h2 style="margin-top: 30px; color: #ff6b6b;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 15px; margin: 0 0 15px 0; font-style: italic;"> Some people who have fallen on hard times have gathered in the alley... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _unemployedNPCs>> <<capture _npc>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 5px 0;"> <em>Unemployed</em> </p> <p style="font-size: 13px; color: #aaa; font-style: italic; margin: 0 0 10px 0;"> Lost their job and ended up here in the alley. </p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Street Sleep Section --> <h2 style="margin-top: 30px; color: #666;">💤 Rest</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #666; margin: 0 0 10px 0;">😴 Sleep on the Street</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.6;"> You can try to catch some sleep curled up behind a pile of trash bags. The stench is overwhelming, and the cold concrete offers little comfort. Rats scurry nearby, and the sounds of the city never quite fade. It's far from ideal, but when you have nowhere else to go, sometimes this is all you can do. </p> <p style="color: #ff6b6b; font-size: 13px; margin: 0 0 15px 0; font-weight: bold; font-style: italic;"> ⚠️ Warning: This is a sketchy place to sleep. Bad things could happen while you're vulnerable... </p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Sleep</div>">> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #666; margin-top: 0;">😴 How long do you want to sleep?</h2> <p style="color: #ccc; margin-bottom: 10px;">Enter hours (max 6):</p> <p style="color: #ff6b6b; font-size: 13px; margin-bottom: 15px; font-style: italic;">⚠️ 5% chance of robbery if you have money</p> <input type="number" id="alley-sleep-input" min="1" max="6" value="4" style="width: 100px; padding: 8px; font-size: 16px; text-align: center; border: 2px solid #666; border-radius: 5px; background: #2a2a2a; color: white;"> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _sleepHours = Number(jQuery("#alley-sleep-input").val())>> <<if _sleepHours < 1 || _sleepHours > 6 || Number.isNaN(_sleepHours)>> <<set _sleepHours = 4>> <</if>> <!-- 5% chance of theft if player has money --> <<set _wasRobbed = false>> <<set _stolenAmount = 0>> <<if $money > 0>> <<set _robberyChance = Math.random() * 100>> <<if _robberyChance < 5>> <<set _stolenAmount = Math.floor($money * 0.5)>> <<set $money -= _stolenAmount>> <<set _wasRobbed = true>> <</if>> <</if>> <<run advanceTime(_sleepHours * 60)>> <<set $appearance.hairStyle = "messy">> <<run Dialog.close()>> <<if _wasRobbed>> <<goto "AlleySleepRobbed">> <<else>> <<goto "AlleySleepSafe">> <</if>> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">👤 Body & Traits Overview</h1> <!-- IMAGE SLOTS --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-bottom: 25px;"> <!-- Face Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; text-align: center; background: #2a2a2a;"> <h3 style="color: #667eea; margin-top: 0;">Face</h3> <<set _faceImagePath = setup.getPlayerFaceImage()>> <<if _faceImagePath && _faceImagePath !== "">> <img @src="_faceImagePath" style="max-width: 100%; height: auto; border-radius: 8px; border: 2px solid #667eea;" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: none; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <<else>> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: flex; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <</if>> </div> <!-- Chest Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; text-align: center; background: #2a2a2a;"> <h3 style="color: #667eea; margin-top: 0;">Chest</h3> <<set _chestImagePath = setup.getPlayerChestImage()>> <<if _chestImagePath && _chestImagePath !== "">> <img @src="_chestImagePath" style="max-width: 100%; height: auto; border-radius: 8px; border: 2px solid #667eea;" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: none; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <<else>> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: flex; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <</if>> </div> <!-- Butt Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; text-align: center; background: #2a2a2a;"> <h3 style="color: #667eea; margin-top: 0;">Butt</h3> <<set _buttImagePath = setup.getPlayerButtImage()>> <<if _buttImagePath && _buttImagePath !== "">> <img @src="_buttImagePath" style="max-width: 100%; height: auto; border-radius: 8px; border: 2px solid #667eea;" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: none; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <<else>> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: flex; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <</if>> </div> </div> <!-- PERSONAL INFORMATION --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin-top: 0;">📋 Personal Information</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div> <strong style="color: #aaa;">Name:</strong> <span style="color: #ccc;">$firstName $lastName</span> </div> <div> <strong style="color: #aaa;">Gender:</strong> <span style="color: #ccc;"><<print $bodyParts.gender.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Housing Status:</strong> <span style="color: <<if $hasApartment>>#51cf66<<else>>#ff6b6b<</if>>;"> <<if $hasApartment>>Housed<<else>>Homeless<</if>> </span> </div> <div> <strong style="color: #aaa;">Age:</strong> <span style="color: #ccc;">$appearance.age</span> </div> </div> </div> <!-- PRONOUNS SECTION --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">💬 Pronouns</h2> <div style="margin-bottom: 15px;"> <strong style="color: #aaa;">Current Pronouns:</strong> <span style="color: #9b59b6; font-size: 18px; font-weight: bold;"> <<if $playerPronouns === "he/him">>He/Him <<elseif $playerPronouns === "she/her">>She/Her <<elseif $playerPronouns === "they/them">>They/Them <<else>>Custom <</if>> </span> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px;"> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #ccc; padding: 12px; border-radius: 8px; cursor: pointer; font-weight: bold; text-align: center; transition: all 0.3s;'>He/Him</div>">> <<set $playerPronouns = "he/him">> <<run setup.gender.setPronouns("male")>> <<goto "Body">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #ccc; padding: 12px; border-radius: 8px; cursor: pointer; font-weight: bold; text-align: center; transition: all 0.3s;'>She/Her</div>">> <<set $playerPronouns = "she/her">> <<run setup.gender.setPronouns("female")>> <<goto "Body">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #ccc; padding: 12px; border-radius: 8px; cursor: pointer; font-weight: bold; text-align: center; transition: all 0.3s;'>They/Them</div>">> <<set $playerPronouns = "they/them">> <<run setup.gender.setPronouns("they")>> <<goto "Body">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #ccc; padding: 12px; border-radius: 8px; cursor: pointer; font-weight: bold; text-align: center; transition: all 0.3s;'>Customize</div>">> <<pronouns>> <</link>> </div> </div> <!-- APPEARANCE DETAILS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin-top: 0;">✨ Appearance Details</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div> <strong style="color: #aaa;">Hair:</strong> <<set _playerHairStyle = $appearance.hairStyle === "messy" ? "Messy " : "">> <<set _playerHairLength = $appearance.hairLength ? $appearance.hairLength.toUpperFirst() : "Short">> <span style="color: #ccc;"><<print _playerHairStyle + _playerHairLength>> $appearance.hairColor</span> </div> <div> <strong style="color: #aaa;">Skin Tone:</strong> <span style="color: #ccc;"><<print $appearance.skinTone.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Chest:</strong> <span style="color: #ccc;"><<print $bodyParts.chest.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Butt:</strong> <span style="color: #ccc;"><<print $bodyParts.butt.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Genitals:</strong> <span style="color: #ccc;"><<print $bodyParts.genitals.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Physique:</strong> <span style="color: #ccc;"><<print $appearance.physique.toUpperFirst()>></span> </div> </div> </div> <!-- STATS --> <<set _bonuses = setup.calculateStatBonuses()>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin-top: 0;">📊 Stats</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div> <strong style="color: #aaa;">Strength:</strong> <span style="color: #ccc;">$stats.strength</span> <<if _bonuses.strength !== 0>> <span style="color: <<if _bonuses.strength > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.strength > 0>>+<</if>>_bonuses.strength) </span> <</if>> </div> <div> <strong style="color: #aaa;">Intelligence:</strong> <span style="color: #ccc;">$stats.intelligence</span> <<if _bonuses.intelligence !== 0>> <span style="color: <<if _bonuses.intelligence > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.intelligence > 0>>+<</if>>_bonuses.intelligence) </span> <</if>> </div> <div> <strong style="color: #aaa;">Charisma:</strong> <span style="color: #ccc;">$stats.charisma</span> <<if _bonuses.charisma !== 0>> <span style="color: <<if _bonuses.charisma > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.charisma > 0>>+<</if>>_bonuses.charisma) </span> <</if>> </div> <div> <strong style="color: #aaa;">Dexterity:</strong> <span style="color: #ccc;">$stats.dexterity</span> <<if _bonuses.dexterity !== 0>> <span style="color: <<if _bonuses.dexterity > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.dexterity > 0>>+<</if>>_bonuses.dexterity) </span> <</if>> </div> </div> </div> <!-- PHYSICAL TRAITS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin-top: 0;">💪 Physical Traits</h2> <<if $physicalTraits && $physicalTraits.length > 0>> <<set _displayPhysicalTraits = $physicalTraits.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair"; })>> <<if _displayPhysicalTraits.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _trait range _displayPhysicalTraits>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <<set _traitColor = _traitValue >= 0 ? "#51cf66" : "#ff6b6b">> <<set _traitBonuses = setup.traitBonuses[_trait] || {}>> <div @style="'background: #1a1a1a; border: 2px solid ' + _traitColor + '; border-radius: 8px; padding: 10px 15px;'"> <strong style="color: #ccc;">_trait</strong> <span @style="'color: ' + _traitColor + '; font-size: 13px; margin-left: 5px;'"> (<<if _traitValue > 0>>+<</if>>_traitValue) </span> <<if Object.keys(_traitBonuses).length > 0>> <div style="font-size: 11px; color: #888; margin-top: 3px;"> <<set _bonusText = []>> <<if _traitBonuses.strength !== undefined>><<run _bonusText.push("STR: " + (_traitBonuses.strength > 0 ? "+" : "") + _traitBonuses.strength)>><</if>> <<if _traitBonuses.intelligence !== undefined>><<run _bonusText.push("INT: " + (_traitBonuses.intelligence > 0 ? "+" : "") + _traitBonuses.intelligence)>><</if>> <<if _traitBonuses.charisma !== undefined>><<run _bonusText.push("CHA: " + (_traitBonuses.charisma > 0 ? "+" : "") + _traitBonuses.charisma)>><</if>> <<if _traitBonuses.dexterity !== undefined>><<run _bonusText.push("DEX: " + (_traitBonuses.dexterity > 0 ? "+" : "") + _traitBonuses.dexterity)>><</if>> <<print _bonusText.join(" ")>> </div> <</if>> </div> <</for>> </div> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No physical traits acquired yet.</p> <</if>> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No physical traits acquired yet.</p> <</if>> </div> <!-- MENTAL TRAITS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin-top: 0;">🧠 Mental Traits</h2> <<if $mentalTraits && $mentalTraits.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _trait range $mentalTraits>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<set _traitColor = _traitValue >= 0 ? "#9b59b6" : "#ff6b6b">> <<set _traitBonuses = setup.traitBonuses[_trait] || {}>> <div @style="'background: #1a1a1a; border: 2px solid ' + _traitColor + '; border-radius: 8px; padding: 10px 15px;'"> <strong style="color: #ccc;">_trait</strong> <span @style="'color: ' + _traitColor + '; font-size: 13px; margin-left: 5px;'"> (<<if _traitValue > 0>>+<</if>>_traitValue) </span> <<if Object.keys(_traitBonuses).length > 0>> <div style="font-size: 11px; color: #888; margin-top: 3px;"> <<set _bonusText = []>> <<if _traitBonuses.strength !== undefined>><<run _bonusText.push("STR: " + (_traitBonuses.strength > 0 ? "+" : "") + _traitBonuses.strength)>><</if>> <<if _traitBonuses.intelligence !== undefined>><<run _bonusText.push("INT: " + (_traitBonuses.intelligence > 0 ? "+" : "") + _traitBonuses.intelligence)>><</if>> <<if _traitBonuses.charisma !== undefined>><<run _bonusText.push("CHA: " + (_traitBonuses.charisma > 0 ? "+" : "") + _traitBonuses.charisma)>><</if>> <<if _traitBonuses.dexterity !== undefined>><<run _bonusText.push("DEX: " + (_traitBonuses.dexterity > 0 ? "+" : "") + _traitBonuses.dexterity)>><</if>> <<print _bonusText.join(" ")>> </div> <</if>> </div> <</for>> </div> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No mental traits acquired yet.</p> <</if>> </div> <!-- SKILLS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin-top: 0;">🎯 Skills</h2> <<if $skills && $skills.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _skill range $skills>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <<set _skillBonuses = setup.skillBonuses[_skill] || {}>> <div style="background: #1a1a1a; border: 2px solid #ffc107; border-radius: 8px; padding: 10px 15px;"> <strong style="color: #ccc;">_skill</strong> <span style="color: #ffc107; font-size: 13px; margin-left: 5px;"> (+_skillValue) </span> <<if Object.keys(_skillBonuses).length > 0>> <div style="font-size: 11px; color: #888; margin-top: 3px;"> <<if _skillBonuses.strength>>STR: <<if _skillBonuses.strength > 0>>+<</if>><<print _skillBonuses.strength>> <</if>> <<if _skillBonuses.intelligence>>INT: <<if _skillBonuses.intelligence > 0>>+<</if>><<print _skillBonuses.intelligence>> <</if>> <<if _skillBonuses.charisma>>CHA: <<if _skillBonuses.charisma > 0>>+<</if>><<print _skillBonuses.charisma>> <</if>> <<if _skillBonuses.dexterity>>DEX: <<if _skillBonuses.dexterity > 0>>+<</if>><<print _skillBonuses.dexterity>><</if>> </div> <</if>> </div> <</for>> </div> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No skills acquired yet.</p> <</if>> </div> <!-- CURRENT JOB --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin-top: 0;">💼 Current Employment</h2> <<if $jobs && $jobs.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _job range $jobs>> <<set _jobValue = setup.getTraitValue("job", _job)>> <div style="background: #1a1a1a; border: 2px solid #667eea; border-radius: 8px; padding: 10px 15px;"> <strong style="color: #ccc;">_job</strong> <span style="color: #667eea; font-size: 13px; margin-left: 5px;"> (Value: _jobValue) </span> </div> <</for>> </div> <<else>> <p style="color: #ff6b6b; font-style: italic; margin: 0;">Currently unemployed.</p> <</if>> </div> <!-- BACK BUTTON --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<set $returningFromBody = true>> <<set _prev = previous()>> <<if $lastLocation && $lastLocation !== "Body" && $lastLocation !== "Debug">> <<goto $lastLocation>> <<elseif _prev !== "Body" && _prev !== "Debug">> <<goto _prev>> <<else>> <<goto "Summary">> <</if>> <</link>> </div> </div> <</nobr>>
:: StoryMenu <<nobr>> [[Body]] [[Relationships]] [[Cheat Menu|Debug]] [[Image Settings|ImageSettings]] [[Patreon|https://www.patreon.com/Grankor]] [[Discord|https://discord.gg/z9eDdQC6zA]] <</nobr>>
<<nobr>> <<set $lastLocation = "Downtown">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🏙️ Downtown</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Downtown.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Downtown"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #4a9eff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> The bustling heart of Sunfish City stretches out before you. Skyscrapers tower overhead, streets are packed with people rushing to their destinations, and the air buzzes with the energy of urban life. Shop fronts line the sidewalks, and the constant hum of traffic fills the air. </p> </div> <h2 style="color: #667eea;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin-top: 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Corporate towers and professional opportunities.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Neon-lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin-top: 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to the dark alleyway.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <!-- Apartments --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin-top: 0;">🏢 Sunfish Apartments</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Residential high-rise offering furnished apartments for rent.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Apartments</div>">> <<goto "Apartments">> <</link>> </div> <!-- Town Hall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin-top: 0;">🏛️ Town Hall</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">The seat of city government and administration.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Town Hall</div>">> <<goto "TownHall">> <</link>> </div> <!-- Aquarium --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1e90ff; margin-top: 0;">🐠 Sunfish City Aquarium</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">A massive oceanarium featuring marine life from around the world.</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BusinessDistrict">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💼 Business District</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/BusinessDistrict.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Business District"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> Gleaming corporate towers pierce the sky. Professionals in sharp suits hurry along pristine sidewalks, clutching briefcases and smartphones. The atmosphere is calculated and ruthlessly efficient. </p> </div> <h2 style="color: #17a2b8;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">City center and hub.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Industrial waterfront district.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Docks</div>">> <<goto "Docks">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Neon-lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <!-- Seabass Park --> <div style="border: 3px solid #2d5016; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #4a7c2c; margin: 0 0 10px 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public park with green spaces and walking paths.</p> <<link "<div style='background: #2d5016; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Park</div>">> <<goto "SeabassPark">> <</link>> </div> <!-- Gym --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">💪 Opah Fitness</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">State of the art gym with weights and cardio equipment.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Gym</div>">> <<goto "OpahFitness">> <</link>> </div> <!-- Dance Studio --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💃 Ribbonfish Dance Studio</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Professional dance studio with classes and private sessions.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Dance Studio</div>">> <<goto "DanceStudio">> <</link>> </div> <!-- Cafe --> <div style="border: 3px solid #8b4513; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">☕ Manta Ray Cafe</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Upscale coffee shop for business professionals.</p> <<link "<div style='background: #8b4513; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Cafe</div>">> <<goto "Cafe">> <</link>> </div> <!-- Training Center --> <div style="border: 3px solid #5c6bc0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #5c6bc0; margin: 0 0 10px 0;">🎓 Bluefin Development Center</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Training center offering courses to improve skills and stats.</p> <<link "<div style='background: #5c6bc0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Training Center</div>">> <<goto "TrainingCenter">> <</link>> </div> <!-- Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Shopping center with stores and services.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Mall</div>">> <<goto "Mall">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "RedLightDistrict">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 Red Light District</h1> <!-- Location Image (Conditional) --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/RedLightDistrict.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Red Light District"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #c31432 0%, #ff1493 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <p style="color: white; font-size: 18px; margin: 0;"> Neon signs cast a crimson glow over the streets. Workers beckon from doorways while shadowy figures conduct business in dark corners. This is where pleasure, vice, and opportunity intertwine. </p> </div> <h2 style="color: #ff1493;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin-top: 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">City center and hub.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Corporate towers and offices.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin-top: 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Industrial waterfront district.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Docks</div>">> <<goto "Docks">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin-top: 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <!-- Outskirts --> <div style="border: 3px solid #4a4a4a; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #888; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Travel to the city outskirts.</p> <<link "<div style='background: #4a4a4a; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Outskirts</div>">> <<goto "Outskirts">> <</link>> </div> <!-- Azure Angelfish Lounge --> <div style="border: 3px solid #007FFF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #007FFF; margin-top: 0;">💋 Azure Angelfish Lounge</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">High-end establishment offering companionship.</p> <<link "<div style='background: #007FFF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Brothel</div>">> <<goto "Brothel">> <</link>> </div> <!-- Electric Jelly Revue --> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9D00FF; margin-top: 0;">🪼 Electric Jelly Revue</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Pulsing music and dancers on stage.</p> <<link "<div style='background: #9D00FF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Strip Club</div>">> <<goto "StripClub">> <</link>> </div> <!-- The Silver Marlin --> <div style="border: 3px solid #C0C0C0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #C0C0C0; margin-top: 0;">🎰 The Silver Marlin</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Bright lights and high stakes gambling.</p> <<link "<div style='background: #C0C0C0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Docks">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">⚓ Docks</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Docks.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Docks"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1e3a5f 0%, #2c5f8d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> The salty tang of sea air fills your lungs as waves lap against weathered wooden piers. Massive cargo ships loom in the harbor, their hulls rusted and barnacle covered. This is a place of hard labor and harder people. </p> </div> <!-- Dock Work Area (Only shows if player is a Dock Worker) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Dock Worker">> <h2 style="color: #28a745;">Your Workplace</h2> <div style="margin-bottom: 25px;"> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;">⚒️ Loading Bay</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Report for dock work. Work hours: 6 AM - 10 PM, max 8 hours per day.</p> <p style="font-size: 14px; color: #28a745; margin: 0 0 10px 0; font-weight: bold;">Pay: $23/hour</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Loading Bay</div>">> <<goto "UniversalWork">> <</link>> </div> </div> <</if>> <h2 style="color: #3498db;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to the Bus Stop</div>">> <<bustravel>> <<goto "BusStop">> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">City center and hub.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel Downtown</div>">> <<travel>> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and offices.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Business District</div>">> <<travel>> <<goto "BusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neon lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Red Light District </div>">> <<travel>> <<goto "RedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Alleyway</div>">> <<travel>> <<goto "Alleyway">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Dock Worker")>> <h2 style="color: #3498db;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The docks are quiet right now. The workers must be on break. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffc107; text-align: center;">🚌 Bus Stop</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Bus.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Bus Stop"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #f39c12 0%, #f1c40f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffc107;"> <p style="color: white; font-size: 18px; margin: 0;"> A covered bus stop with benches and a digital display showing arrival times. People wait patiently, some checking their phones, others reading newspapers. </p> </div> <!-- Bus Pass Information --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin: 0 0 15px 0;">🎫 Your Bus Pass Status</h2> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #28a745; margin-bottom: 15px;"> <p style="color: #28a745; margin: 0; text-align: center; font-size: 18px; font-weight: bold;"> ✅ Active 30-Day Pass </p> <p style="color: #aaa; margin: 10px 0 0 0; text-align: center;"> Days Remaining: <strong style="color: #51cf66;"><<print $busPassDaysRemaining>></strong> </p> </div> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #dc3545; margin-bottom: 15px;"> <p style="color: #dc3545; margin: 0; text-align: center; font-size: 18px; font-weight: bold;"> ❌ No Active Pass </p> <p style="color: #aaa; margin: 10px 0 0 0; text-align: center;"> You'll need to pay per ride or purchase a pass </p> </div> <</if>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center;"> <strong>Your Money:</strong> <<print setup.formatMoney($money)>> </p> </div> </div> <!-- Purchase Options --> <h2 style="color: #ffc107;">Purchase Tickets</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Single Ride --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🎫 Single Ride</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 5px 0; line-height: 1.4;">One-way ticket to any destination.</p> <p style="font-size: 18px; color: #51cf66; margin: 0 0 auto 0; font-weight: bold; flex-grow: 1;">$5</p> <p style="font-size: 12px; color: #aaa; margin: 0 0 10px 0; font-style: italic;">Pay per ride</p> </div> <!-- 30-Day Pass --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">🎟️ 30-Day Pass</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 5px 0; line-height: 1.4;">Unlimited rides for 30 days.</p> <p style="font-size: 18px; color: #51cf66; margin: 0 0 5px 0; font-weight: bold;">$50</p> <p style="font-size: 12px; color: #aaa; margin: 0 0 auto 0; font-style: italic; flex-grow: 1;">Best value for frequent travelers!</p> <<if !$busPassDaysRemaining || $busPassDaysRemaining <= 0>> <<if $money >= 50>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Purchase Pass ($50)</div>">> <<set $money -= 50>> <<set $busPassDaysRemaining = 30>> <<goto "BusStop">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Enough Money</div> <</if>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Already Have Pass</div> <</if>> </div> </div> <!-- Bus Routes --> <h2 style="color: #ffc107;">Bus Routes</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">City center and hub.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Downtown">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Downtown">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and offices.</p> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "BusinessDistrict">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "BusinessDistrict">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Industrial waterfront district.</p> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Docks">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Docks">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neon lit streets of nightlife.</p> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "RedLightDistrict">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "RedLightDistrict">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Alleyway">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Alleyway">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Outskirts --> <div style="border: 3px solid #4a4a4a; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #888; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Rural areas outside the city.</p> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<link "<div style='background: #4a4a4a; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Outskirts">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #4a4a4a; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Outskirts">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Go Home (Apartment) --> <<if $hasApartment>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🏠 Go Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take the bus to your apartment.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "StudioApartment">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "StudioApartment">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🏠 Go Home</h3> <p style="font-size: 14px; color: #666; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">You don't have a home to go to.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>No Apartment</div> </div> <</if>> <!-- NPC Interaction - Bus Driver --> <<set _npcsHere = setup.getNPCsByJob("Bus Driver")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #ffc107; margin-top: 30px;">Bus Driver</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 15px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;"> <<print _npc.jobs.join(", ")>> </p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> <</if>> </div> <!-- Walk Option --> <div style="text-align: center; margin-top: 30px;"> <p style="color: #aaa; font-size: 14px; margin-bottom: 10px;">Or you can walk for free (takes longer)</p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Go back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !setup.isMallOpen()>> <<goto "MallClosed">> <</if>> <<set $lastLocation = "Mall">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🛍️ Sunfish City Mall</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> A sprawling shopping complex filled with stores, restaurants, and people. The air conditioning is a welcome relief from the outside heat. </p> </div> <h2 style="color: #9b59b6;">Mall Directory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Fitness Shop --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">💪 Barracuda Fitness</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Workout equipment, supplements, and athletic wear.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Shop</div>">> <<goto "FitnessShop">> <</link>> </div> <!-- Ecentric Shop --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🌙 Lionfish Boutique</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Alternative fashion, dark clothing, and unique accessories.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Shop</div>">> <<goto "EcentricShop">> <</link>> </div> <!-- Beauty Salon --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💄 Angelfish Beauty Salon</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Hair styling, makeup, and beauty services.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Salon</div>">> <<goto "BeautySalon">> <</link>> </div> <!-- Tech Store --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💻 Hammerhead Tech</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Electronics, computers, and technical support.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "TechStore">> <</link>> </div> <!-- Adult Store --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🔞 Stingray Adult Emporium</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Adult products and toys. 18+ only.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "AdultStore">> <</link>> </div> <!-- Bakery --> <div style="border: 3px solid #d2691e; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">🥐 Seahorse Bakery</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Fresh baked goods, pastries, and bread.</p> <<link "<div style='background: #d2691e; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bakery</div>">> <<goto "Bakery">> <</link>> </div> </div> <br> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #9b59b6; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Go to Floor 2 ⬆️</div>">> <<goto "MallFloor2">> <</link>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Mall</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Mall")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #9b59b6; margin-top: 30px;">🛍️ People at the Mall</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 20px 0;">Some people are shopping at the mall.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> </div> <</nobr>>
:: ImageManager <<nobr>><style>.image-manager{padding:20px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);min-height:100vh}.manager-container{max-width:1400px;margin:0 auto;background:white;border-radius:15px;padding:30px;box-shadow:0 10px 40px rgba(0,0,0,0.3)}.manager-title{text-align:center;color:#667eea;font-size:2.5em;margin-bottom:30px}.section-tabs{display:flex;gap:10px;margin-bottom:30px;border-bottom:3px solid #e9ecef;flex-wrap:wrap}.tab-button{padding:15px 30px;border:none;background:#f8f9fa;cursor:pointer;font-size:16px;font-weight:600;border-radius:10px 10px 0 0;transition:all 0.3s}.tab-button:hover{background:#e9ecef}.tab-button.active{background:#667eea;color:white}.tab-content{display:none}.tab-content.active{display:block}.skin-tone-filter{display:flex;gap:10px;margin-bottom:20px;padding:15px;background:#f8f9fa;border-radius:10px;flex-wrap:wrap}.tone-button{padding:10px 20px;border:2px solid #dee2e6;background:white;cursor:pointer;font-weight:600;border-radius:5px;transition:all 0.3s}.tone-button:hover{border-color:#667eea}.tone-button.active{background:#667eea;color:white;border-color:#667eea}.image-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:20px;margin-top:20px}.image-card{border:2px solid #dee2e6;border-radius:10px;padding:15px;background:#f8f9fa;transition:all 0.3s}.image-card:hover{border-color:#667eea;box-shadow:0 5px 15px rgba(102,126,234,0.2)}.image-card h3{color:#667eea;margin-bottom:10px;font-size:14px;text-transform:capitalize}.image-preview{width:100%;height:180px;background:#e9ecef;border-radius:8px;margin-bottom:10px;display:flex;align-items:center;justify-content:center;overflow:hidden}.image-preview img{max-width:100%;max-height:100%;object-fit:contain}.image-preview.empty{color:#999;font-style:italic;font-size:12px}.url-input{width:100%;padding:8px;border:2px solid #dee2e6;border-radius:5px;font-size:12px;margin-bottom:8px}.url-input:focus{outline:none;border-color:#667eea}.btn-group{display:flex;gap:5px}.btn{flex:1;padding:8px;border:none;border-radius:5px;cursor:pointer;font-weight:600;font-size:11px;transition:all 0.3s}.btn-save{background:#28a745;color:white}.btn-save:hover{background:#218838}.btn-clear{background:#dc3545;color:white}.btn-clear:hover{background:#c82333}.btn-test{background:#17a2b8;color:white}.btn-test:hover{background:#138496}.back-link{display:inline-block;margin-top:30px;padding:15px 30px;background:#6c757d;color:white;text-decoration:none;border-radius:8px;font-weight:600;transition:all 0.3s}.back-link:hover{background:#5a6268;transform:translateY(-2px)}.export-section{margin-top:30px;padding:20px;background:#f8f9fa;border-radius:10px;border:2px solid #667eea}.export-section h3{color:#667eea;margin-bottom:15px}.code-output{background:#2d2d2d;color:#00ff00;padding:15px;border-radius:5px;font-family:'Courier New',monospace;font-size:11px;max-height:300px;overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}.filename-hint{font-size:11px;color:#6c757d;font-style:italic;margin-bottom:5px}</style><div class="image-manager"><div class="manager-container"><h1 class="manager-title">🖼️ Body Part Image Manager</h1><div class="section-tabs"><button class="tab-button active" onclick="switchTab('chest')">Chest Sizes</button><button class="tab-button" onclick="switchTab('butt')">Butt Sizes</button><button class="tab-button" onclick="switchTab('face')">Face Images</button></div><div id="chest-tab" class="tab-content active"><h2>Chest Size Images</h2><div class="skin-tone-filter"><span style="font-weight:600;margin-right:10px;">Skin Tone:</span><button class="tone-button active" onclick="filterByTone('chest','bronzed')">Bronzed</button><button class="tone-button" onclick="filterByTone('chest','pale')">Pale</button><button class="tone-button" onclick="filterByTone('chest','dark')">Dark</button></div><div class="image-grid" id="chest-grid"></div></div><div id="butt-tab" class="tab-content"><h2>Butt Size Images</h2><div class="skin-tone-filter"><span style="font-weight:600;margin-right:10px;">Skin Tone:</span><button class="tone-button active" onclick="filterByTone('butt','bronzed')">Bronzed</button><button class="tone-button" onclick="filterByTone('butt','pale')">Pale</button><button class="tone-button" onclick="filterByTone('butt','dark')">Dark</button></div><div class="image-grid" id="butt-grid"></div></div><div id="face-tab" class="tab-content"><h2>Face Images</h2><div class="skin-tone-filter"><span style="font-weight:600;margin-right:10px;">Hair Color:</span><button class="tone-button active" onclick="filterFaceByHair('Black')">Black</button><button class="tone-button" onclick="filterFaceByHair('Brown')">Brown</button><button class="tone-button" onclick="filterFaceByHair('Blonde')">Blonde</button><button class="tone-button" onclick="filterFaceByHair('Red')">Red</button><button class="tone-button" onclick="filterFaceByHair('PlatinumBlonde')">Platinum Blonde</button></div><div class="image-grid" id="face-grid"></div></div><div class="export-section"><h3>📋 Export Image Data</h3><p style="margin-bottom:10px;">Copy this code and paste it into your StoryInit to save your image assignments:</p><div class="code-output" id="export-output"></div><button class="btn btn-test" onclick="copyExportCode()" style="margin-top:10px;width:auto;">Copy to Clipboard</button></div><a href="javascript:void(0)" class="back-link" onclick="Engine.backward()">← Back to Game</a></div></div><script>const bodyPartSizes={chest:["flat masculine","flat","small","medium","big","huge","gigantic"],butt:["flat masculine","flat","small","medium","big","huge","gigantic"]},skinTones=["bronzed","pale","dark"],hairColors=['Black','Brown','Blonde','Red','PlatinumBlonde'],hairStyles=['styled','messy'];let currentTone={chest:"bronzed",butt:"bronzed"},currentFaceHair='Black';function switchTab(t){document.querySelectorAll(".tab-content").forEach(t=>{t.classList.remove("active")}),document.querySelectorAll(".tab-button").forEach(t=>{t.classList.remove("active")}),document.getElementById(t+"-tab").classList.add("active"),event.target.classList.add("active")}function filterByTone(t,e){currentTone[t]=e;const n=document.querySelectorAll(`#${t}-tab .tone-button`);n.forEach(t=>t.classList.remove("active")),event.target.classList.add("active");const a=document.getElementById(`${t}-grid`);a.innerHTML="",bodyPartSizes[t].forEach(n=>{a.appendChild(createImageCard(t,n,e))})}function filterFaceByHair(t){currentFaceHair=t;const e=document.querySelectorAll('#face-tab .tone-button');e.forEach(btn=>btn.classList.remove('active')),event.target.classList.add('active');const n=document.getElementById('face-grid');n.innerHTML='';const genders=['female','male'],maturities=[false,true];maturities.forEach(mature=>{hairStyles.forEach(style=>{skinTones.forEach(tone=>{genders.forEach(gender=>{n.appendChild(createFaceCard(t,style,tone,gender,mature))})})})})}function getFilenameSuggestion(t,e,n){let a=e.replace(/\s+/g,"").toLowerCase();return a=a.replace("masculine",""),`${a}${n}${t}`}function createImageCard(t,e,n){const a=document.createElement("div");a.className="image-card";const s=document.createElement("h3");s.textContent=`${e} - ${n}`,a.appendChild(s);const r=document.createElement("div");r.className="filename-hint";const o=getFilenameSuggestion(t,e,n);r.textContent=`Suggested: ${o}.webp`,a.appendChild(r);const c=document.createElement("div");c.className="image-preview",c.id=`preview-${t}-${e.replace(/\s+/g,"_")}-${n}`;const i=`${e}_${n}`,l=State.variables.bodyPartImages[t][i]||"";if(l){const t=document.createElement("img");t.src=l,c.appendChild(t)}else c.classList.add("empty"),c.textContent="No image";a.appendChild(c);const d=document.createElement("input");d.type="text",d.className="url-input",d.placeholder="Enter image URL...",d.value=l,d.id=`input-${t}-${e.replace(/\s+/g,"_")}-${n}`,a.appendChild(d);const u=document.createElement("div");u.className="btn-group";const m=document.createElement("button");m.className="btn btn-save",m.textContent="Save",m.onclick=()=>saveImage(t,e,n),u.appendChild(m);const g=document.createElement("button");g.className="btn btn-clear",g.textContent="Clear",g.onclick=()=>clearImage(t,e,n),u.appendChild(g);const p=document.createElement("button");return p.className="btn btn-test",p.textContent="Test",p.onclick=()=>testImage(t,e,n),u.appendChild(p),a.appendChild(u),a}function createFaceCard(hairColor,hairStyle,skinTone,gender,isMature){const card=document.createElement('div');card.className='image-card';const maturePrefix=isMature?'m':'';const title=document.createElement('h3');title.textContent=`${isMature?'Mature ':''}${hairColor} - ${hairStyle} - ${skinTone} - ${gender}`;card.appendChild(title);const hint=document.createElement('div');hint.className='filename-hint';hint.style.color='#28a745';hint.style.fontWeight='bold';hint.textContent=`File Path: Images/Face/${maturePrefix}${hairColor.toLowerCase()}_${hairStyle}_${skinTone}_${gender}.webp`;card.appendChild(hint);const preview=document.createElement('div');preview.className='image-preview';preview.id=`preview-face-${maturePrefix}${hairColor}_${hairStyle}_${skinTone}_${gender}`;const filePath=`Images/Face/${maturePrefix}${hairColor.toLowerCase()}_${hairStyle}_${skinTone}_${gender}.webp`;const img=document.createElement('img');img.src=filePath;img.onerror=function(){preview.innerHTML='';preview.classList.add('empty');preview.textContent='No image found'};img.onload=function(){preview.classList.remove('empty')};preview.appendChild(img);card.appendChild(preview);const infoText=document.createElement('div');infoText.style.fontSize='11px';infoText.style.color='#6c757d';infoText.style.marginTop='10px';infoText.style.fontStyle='italic';infoText.textContent='Face images load automatically from Images/Face/ folder';card.appendChild(infoText);return card}function saveImage(t,e,n){const a=document.getElementById(`input-${t}-${e.replace(/\s+/g,"_")}-${n}`).value.trim(),s=`${e}_${n}`;State.variables.bodyPartImages[t][s]=a,updatePreview(t,e,n,a),updateExportCode();const r=event.target,o=r.textContent;r.textContent="✓ Saved!",r.style.background="#218838",setTimeout(()=>{r.textContent=o,r.style.background=""},1500)}function clearImage(t,e,n){document.getElementById(`input-${t}-${e.replace(/\s+/g,"_")}-${n}`).value="";const a=`${e}_${n}`;State.variables.bodyPartImages[t][a]="",updatePreview(t,e,n,""),updateExportCode()}function testImage(t,e,n){const a=document.getElementById(`input-${t}-${e.replace(/\s+/g,"_")}-${n}`).value.trim();a?updatePreview(t,e,n,a):alert("Please enter a URL first")}function updatePreview(t,e,n,a){const s=document.getElementById(`preview-${t}-${e.replace(/\s+/g,"_")}-${n}`);if(s.innerHTML="",a){s.classList.remove("empty");const t=document.createElement("img");t.src=a,t.onerror=()=>{s.innerHTML="",s.classList.add("empty"),s.textContent="❌ Invalid URL"},s.appendChild(t)}else s.classList.add("empty"),s.textContent="No image"}function updateExportCode(){const t=`<<set $bodyPartImages = ${JSON.stringify(State.variables.bodyPartImages,null,2).replace(/"([^"]+)":/g,"$1:")}>>`;document.getElementById("export-output").textContent=t}function copyExportCode(){const t=document.getElementById("export-output").textContent;navigator.clipboard.writeText(t).then(()=>{const t=event.target,e=t.textContent;t.textContent="✓ Copied!",setTimeout(()=>{t.textContent=e},2e3)})}function initializeGrids(){const t=document.getElementById("chest-grid");bodyPartSizes.chest.forEach(e=>{t.appendChild(createImageCard("chest",e,"bronzed"))});const e=document.getElementById("butt-grid");bodyPartSizes.butt.forEach(t=>{e.appendChild(createImageCard("butt",t,"bronzed"))});const n=document.getElementById('face-grid'),genders=['female','male'],maturities=[false,true];maturities.forEach(mature=>{hairStyles.forEach(style=>{skinTones.forEach(tone=>{genders.forEach(gender=>{n.appendChild(createFaceCard('Black',style,tone,gender,mature))})})})}),updateExportCode()}initializeGrids();</script><<endnobr>>
<<nobr>> <<set $lastLocation = "FitnessShop">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e74c3c; text-align: center;">💪 Barracuda Fitness</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: white; font-size: 18px; margin: 0;"> A sleek fitness equipment store with weights, yoga mats, and protein supplements lining the shelves. The smell of rubber and determination fills the air. </p> </div> <h2 style="color: #e74c3c;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Shop</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Fitness Shop Clerk">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Fitness Shop Clerk")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #e74c3c;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #e74c3c;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The shop is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BeautySalon">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💇 Angelfish Beauty Salon</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A pristine salon with mirrors lining the walls, styling chairs, and the pleasant scent of hair products. Soft music plays as stylists work their magic. </p> </div> <!-- Hair Styling Service --> <h2 style="color: #e91e63;">Services</h2> <<set _hasEmployedStylist = false>> <<set _npcsHere = setup.getNPCsByJob("Beauty Salon Stylist")>> <<if _npcsHere && _npcsHere.length > 0>> <<for _npc range _npcsHere>> <<if setup.isNPCAvailable(_npc.name)>> <<set _hasEmployedStylist = true>> <<break>> <</if>> <</for>> <</if>> <<set _playerIsEmployee = $jobs && $jobs.length > 0 && $jobs[0] === "Beauty Salon Stylist">> <<set _stylingCost = _playerIsEmployee ? 0 : 50>> <<set _haircutCost = _playerIsEmployee ? 0 : 50>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Hair Styling --> <<if _hasEmployedStylist>> <<if $appearance.hairStyle === "messy">> <<if _stylingCost > 0 && $money < _stylingCost>> <!-- Can't afford --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair professionally styled.</p> <p style="font-size: 14px; color: #dc3545; margin-bottom: 15px;">Cost: $<<print _stylingCost>></p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Enough Money</div> </div> <<else>> <!-- Can afford or free --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair professionally styled.</p> <<if _stylingCost > 0>> <p style="font-size: 14px; color: #ffc107; margin-bottom: 15px;">Cost: $<<print _stylingCost>></p> <<else>> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">Employee Discount: FREE</p> <</if>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Style Hair</div>">> <<if _stylingCost > 0>> <<set $money -= _stylingCost>> <</if>> <<set $appearance.hairStyle = "styled">> <<goto "BeautySalon">> <</link>> </div> <</if>> <<else>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Your hair is already styled!</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Already Styled</div> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">No stylist available.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Unavailable</div> </div> <</if>> <!-- Hair Cut Service (Long to Short) --> <<if _hasEmployedStylist>> <<set _hasLongHair = false>> <<if $physicalTraits && $physicalTraits.length > 0>> <<for _i to 0; _i lt $physicalTraits.length; _i++>> <<if $physicalTraits[_i] === "Long Hair">> <<set _hasLongHair = true>> <<break>> <</if>> <</for>> <</if>> <<if _hasLongHair>> <<if _haircutCost > 0 && $money < _haircutCost>> <!-- Can't afford --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair cut short.</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 10px;">Changes: Long Hair → Short Hair</p> <p style="font-size: 14px; color: #dc3545; margin-bottom: 15px;">Cost: $<<print _haircutCost>></p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Enough Money</div> </div> <<else>> <!-- Can afford or free --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair cut short.</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 10px;">Changes: Long Hair → Short Hair</p> <<if _haircutCost > 0>> <p style="font-size: 14px; color: #ffc107; margin-bottom: 15px;">Cost: $<<print _haircutCost>></p> <<else>> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">Employee Discount: FREE</p> <</if>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Cut Hair Short</div>">> <<if _haircutCost > 0>> <<set $money -= _haircutCost>> <</if>> <<set $appearance.hairLength = "short">> <<for _i to 0; _i lt $physicalTraits.length; _i++>> <<if $physicalTraits[_i] === "Long Hair">> <<set $physicalTraits.deleteAt(_i)>> <<break>> <</if>> <</for>> <<if !$physicalTraits.includes("Short Hair")>> <<set $physicalTraits.push("Short Hair")>> <</if>> <<goto "BeautySalon">> <</link>> </div> <</if>> <<else>> <!-- Already has short hair --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">You don't have long hair to cut.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Available</div> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">No stylist available.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Unavailable</div> </div> <</if>> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin-bottom: 15px;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave Salon</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Beauty Salon Stylist">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #e91e63;">Stylists Working</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #e91e63;">Stylists Working</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The salon is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "EcentricShop">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🌙 Lionfish Boutique</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #6a1b9a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> A dark, mysterious shop filled with gothic clothing, occult items, and alternative fashion. Incense smoke curls through the air as dark music plays softly. </p> </div> <h2 style="color: #9b59b6;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Shop</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Ecentric Shop Worker">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Ecentric Shop Worker")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #9b59b6;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #9b59b6;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The shop is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "AdultStore">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">🔞 Stingray Adult Emporium</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #d63031 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> A discreet shop with tinted windows, offering adult toys, lingerie, and other intimate products. The atmosphere is mature but welcoming. </p> </div> <!-- Shop Inventory --> <h2 style="color: #ff6b6b;">Shop Inventory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Dildo --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 200px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🍆 Dildo</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;"> A realistic silicone toy. Available in various sizes and colors. Perfect for solo play. </p> <div style="color: #4ade80; font-weight: bold; font-size: 18px; margin: 10px 0;">$45</div> <<if $ownsDildo>> <div style="background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Owned</div> <<elseif $money >= 45>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Purchase ($45)</div>">> <<set $money -= 45>> <<set $ownsDildo = true>> <<goto "AdultStore">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Not Enough Money</div> <</if>> </div> <!-- Fleshlight --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 200px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🔦 Fleshlight</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;"> A discreet sleeve toy designed for men. Soft, realistic material with various textures available. </p> <div style="color: #4ade80; font-weight: bold; font-size: 18px; margin: 10px 0;">$50</div> <<if $ownsFleshlight>> <div style="background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Owned</div> <<elseif $money >= 50>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Purchase ($50)</div>">> <<set $money -= 50>> <<set $ownsFleshlight = true>> <<goto "AdultStore">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Not Enough Money</div> <</if>> </div> </div> <h2 style="color: #ff6b6b;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Store</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Adult Store Clerk">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Adult Store Clerk")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #ff6b6b;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #ff6b6b;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The store is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Bakery">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #d2691e; text-align: center;">🥐 Seahorse Bakery</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d2691e 0%, #a0522d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #d2691e;"> <p style="color: white; font-size: 18px; margin: 0;"> The warm, inviting scent of fresh bread and pastries fills the air. Display cases showcase croissants, cakes, and artisan loaves. </p> </div> <h2 style="color: #d2691e;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Bakery</div>">> <<goto "Mall">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Baker")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #d2691e;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #d2691e; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #d2691e; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #d2691e; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #d2691e;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The bakery is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "TechStore">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💻 Hammerhead Tech</h1> <div style="padding: 20px; background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> A modern electronics store showcasing the latest gadgets, computers, and accessories. Blue LED lighting gives everything a futuristic glow. </p> </div> <!-- Leave --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🚪 Exit</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Store</div>">> <<goto "Mall">> <</link>> </div> </div> <h2 style="color: #17a2b8;">Electronics for Sale</h2> <div style="margin-bottom: 25px;"> <!-- Laptop Purchase --> <<if !$hasLaptop>> <<set _laptopColor = $hasApartment ? "#17a2b8" : "#666">> <<set _laptopTextColor = $hasApartment ? "#aaa" : "#888">> <div style="border: 2px solid <<print _laptopColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _laptopColor>>; margin: 0 0 10px 0; font-size: 16px;">💻 Laptop</h3> <p style="font-size: 14px; color: <<print _laptopTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A decent laptop for work and entertainment.</p> <div style="flex-grow: 1;"></div> <<if $hasApartment>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$500</p> <<if $money >= 500>> <<link "<div style='background: #17a2b8; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Laptop</div>">> <<set $money -= 500>> <<set $hasLaptop = true>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$500</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Housing</div> <</if>> </div> <</if>> <!-- TV Purchase --> <<if !$hasTV>> <<set _tvColor = $hasApartment ? "#667eea" : "#666">> <<set _tvTextColor = $hasApartment ? "#aaa" : "#888">> <div style="border: 2px solid <<print _tvColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _tvColor>>; margin: 0 0 10px 0; font-size: 16px;">📺 Flatscreen TV</h3> <p style="font-size: 14px; color: <<print _tvTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A 42-inch flatscreen TV.</p> <div style="flex-grow: 1;"></div> <<if $hasApartment>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$300</p> <<if $money >= 300>> <<link "<div style='background: #667eea; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase TV</div>">> <<set $money -= 300>> <<set $hasTV = true>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$300</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Housing</div> <</if>> </div> <</if>> <!-- Internet Router Purchase --> <<if !$hasRouter>> <<set _routerColor = $hasApartment ? "#f39c12" : "#666">> <<set _routerTextColor = $hasApartment ? "#aaa" : "#888">> <div style="border: 2px solid <<print _routerColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _routerColor>>; margin: 0 0 10px 0; font-size: 16px;">📡 Internet Router</h3> <p style="font-size: 14px; color: <<print _routerTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A high-speed wireless router for your home internet.</p> <div style="flex-grow: 1;"></div> <<if $hasApartment>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$70</p> <<if $money >= 70>> <<link "<div style='background: #f39c12; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Router</div>">> <<set $money -= 70>> <<set $hasRouter = true>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$70</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Housing</div> <</if>> </div> <</if>> <!-- Webcam Purchase --> <<if !$hasWebcam>> <<set _webcamColor = $hasLaptop ? "#e74c3c" : "#666">> <<set _webcamTextColor = $hasLaptop ? "#aaa" : "#888">> <div style="border: 2px solid <<print _webcamColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _webcamColor>>; margin: 0 0 10px 0; font-size: 16px;">📷 HD Webcam</h3> <p style="font-size: 14px; color: <<print _webcamTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A high-quality 1080p webcam for video calls and streaming.</p> <div style="flex-grow: 1;"></div> <<if $hasLaptop>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$200</p> <<if $money >= 200>> <<link "<div style='background: #e74c3c; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Webcam</div>">> <<set $money -= 200>> <<set $hasWebcam = true>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$200</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Laptop</div> <</if>> </div> <</if>> <!-- Smartphone - Coming Soon --> <div style="border: 2px solid #666; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: #aaa; margin: 0 0 10px 0; font-size: 16px;">📱 Smartphone</h3> <p style="font-size: 14px; color: #888; margin: 0 0 10px 0; line-height: 1.4;">A modern smartphone with all the latest features.</p> <div style="flex-grow: 1;"></div> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">Price: TBA</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>🚧 Coming Soon</div> </div> </div> <!-- WiFi Service Section --> <<if $hasRouter && $hasApartment>> <h2 style="color: #17a2b8;">Internet Service</h2> <!-- Initialize WiFi variables if not set --> <<if $wifiDaysRemaining === undefined>> <<set $wifiDaysRemaining = 0>> <</if>> <<if $wifiDaysRemaining > 0>> <div style="border: 2px solid #51cf66; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 12px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; font-size: 16px;">✅ WiFi Active</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Your internet service is active. Days remaining: <<print $wifiDaysRemaining>></p> <p style="font-size: 14px; color: #51cf66; margin: 0; text-align: center;">Monthly Rate: $40 (per 30 days)</p> </div> <<else>> <div style="border: 2px solid #dc3545; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 12px;"> <h3 style="color: #dc3545; margin: 0 0 10px 0; font-size: 16px;">❌ No Active Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">You need to set up internet service to use your router.</p> <p style="font-size: 14px; color: #51cf66; margin: 0; text-align: center;">Monthly Rate: $40 (per 30 days)</p> </div> <</if>> <!-- Pay for WiFi --> <div style="border: 2px solid #28a745; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #28a745; margin: 0 0 10px 0; font-size: 16px;">💳 Pay for Internet Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Add 30 days of internet service for $40. You can pay in advance for multiple months.</p> <div style="flex-grow: 1;"></div> <<if $money >= 40>> <<link "<div style='background: #28a745; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Pay $40 for 30 Days</div>">> <<set $money -= 40>> <<set $wifiDaysRemaining += 30>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> </div> <</if>> <!-- NPC Interaction --> <<set _npcsHere = setup.getNPCsByJob("Tech Store Clerk")>> <<if _npcsHere && _npcsHere.length > 0>> <<for _npc range _npcsHere>> <<capture _npc>> <h2 style="color: #17a2b8;">Store Clerk</h2> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;"> <<print _npc.jobs.join(", ")>> </p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> <!-- WiFi Setup Option --> <<if $hasRouter && !$wifiSetupComplete>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Ask About WiFi Setup</div>">> <<set $wifiSetupComplete = true>> <<goto "TechStoreWiFiSetup">> <</link>> <</if>> </div> <</capture>> <</for>> <</if>> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Tech Store Clerk">> <h2 style="color: #17a2b8;">Work Options</h2> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> <!-- Self-Setup WiFi (if you work here) --> <<if $hasRouter && !$wifiSetupComplete>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Set Up Your Own WiFi</div>">> <<set $wifiSetupComplete = true>> <<goto "TechStoreWiFiSetup">> <</link>> <</if>> </div> <</if>> </div> <</nobr>>
<<silently>> <<nobr>> <!-- Ensure all mayors have Perverted trait --> <<run setup.addPervertedTraitToMayors()>> /* Set current and previous passage variables */ <<set _currentPassage = passage()>> <<set _previousPassage = previous()>> <<if $tradingWithNPC && _currentPassage === "NPCInteraction">> <<run setup.meetNPC($tradingWithNPC)>> <</if>> /* List of passages that should NOT be saved as lastLocation */ <<set _excludedPassages = [ "Relationships", "RelationshipDetail", "Debug", "DebugDateTime", "DebugStatsAppearance", "DebugHousingTech", "DebugStreaming", "DebugRelationships", "DebugTraitsSkillsJobs", "Body", "StoryInit", "PassageHeader", "StoryCaption", "TradeInterface", "TradeSelectItems", "TradeResult", "NPCInteraction", "NPCTalk", "NPCTalkResponse", "FenRisTraining", "GymNPCs", "GymLockerRoom", "ImageSettings", "BusStop", "UseLaptop", "WatchTV", "TechStoreWiFiSetup", "ContentCreatorRegistration", "StreamingRegistration", "PostContent", "StartStreaming", "StartGamingStream", "StartASMRStream", "StartStylingStream", "StreamActionResult", "StreamAnalytics", "StartMusicStream", "StartCookingStream" ]>> /* Only update lastLocation if this is a real game location */ <<if !_excludedPassages.includes(_currentPassage) && _currentPassage !== "">> <<set $lastLocation = _currentPassage>> <</if>> /* Rest of your existing PassageHeader code goes here */ /* Check if we should skip time advancement */ <<if $skipTimeAdvancement>> <<set $skipTimeAdvancement = false>> <<else>> <<if !setup.timePassages>> <<set setup.timePassages = { main: ["BusinessDistrict", "Downtown", "ResidentialArea", "Park", "Beach", "University", "Hospital", "Library", "Gym", "Alleyway", "RedLightDistrict", "Docks", "Outskirts", "SeabassPark"], sublocations: ["Gym", "DanceStudio", "Cafe", "TrainingCenter", "Apartments", "TownHall", "ShadyShop", "Brothel", "StripClub", "Casino","LampreyTomes"], mall: ["Mall", "FitnessShop", "EcentricShop", "BeautySalon", "TechStore", "AdultStore", "Bakery", "FoodCourt", "MallAtrium"], noTime: ["Start", "CharacterCreation", "StoryInit", "Summary", "NPCFirstMeeting", "NPCEncounter", "NPCChat", "NPCSkillTalk", "NPCInterestTalk", "TradingInterface", "ProcessTrade", "TradeSuccess", "TradeFailure", "Body", "Debug", "DebugDateTime", "DebugStatsAppearance", "DebugHousingTech", "DebugStreaming", "DebugRelationships", "DebugTraitsSkillsJobs", "BusStop", "PrawnHub", "PrawnHubStream", "PrawnHubLiveStream", "PrawnHubStreamEnd", "PrawnHub_Action01", "PrawnHub_Action02", "PrawnHub_Action03", "PrawnHub_Action04", "PrawnHub_Action05", "PrawnHub_Action06", "PrawnHub_Action07", "PrawnHub_Action08", "PrawnHub_Action09", "PrawnHub_Action10", "PrawnHub_Action11"] }>> <</if>> <<if !setup.timePassages.noTime.includes(_currentPassage) && _previousPassage !== _currentPassage && _previousPassage !== "">> <<if setup.timePassages.main.includes(_currentPassage)>> <<set $timeInMinutes += 15>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < $dayOrder.length - 1>> <<set $dayOfWeek = $dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = $dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <</if>> <<elseif setup.timePassages.sublocations.includes(_currentPassage)>> <<set $timeInMinutes += 5>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < $dayOrder.length - 1>> <<set $dayOfWeek = $dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = $dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <</if>> <<elseif setup.timePassages.mall.includes(_currentPassage)>> <<if _previousPassage === "Mall">> <<set $timeInMinutes += 2>> <<else>> <<set $timeInMinutes += 5>> <</if>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < $dayOrder.length - 1>> <<set $dayOfWeek = $dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = $dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <</if>> <</if>> <</if>> <</if>> <<if $tradingWithNPC && _currentPassage === "TradeInterface">> <<run setup.meetNPC($tradingWithNPC)>> <</if>> <</nobr>> <</silently>>
:: InitPlayerData <<silently>> /* ---------------------------------- */ /* --- PLAYER STATS --- */ /* ---------------------------------- */ <<set $stats = { charisma: 5, dexterity: 5, strength: 5, intelligence: 5 }>> <<set $statMaxCaps = { charisma: 300, dexterity: 300, strength: 300, intelligence: 300 }>> /* ---------------------------------- */ /* --- PLAYER APPEARANCE --- */ /* ---------------------------------- */ <<if !$appearance>> <<set $appearance = { skinTone: "pale", hairColor: "Black", hairStyle: "messy", physique: "average", age: "Adult" }>> <</if>> /* Make sure age exists */ <<if !$appearance.age>> <<set $appearance.age = "Adult">> <</if>> /* Make sure physique exists */ <<if !$appearance.physique>> <<set $appearance.physique = "average">> <</if>> /* Make sure hairStyle is messy */ <<if !$appearance.hairStyle>> <<set $appearance.hairStyle = "messy">> <</if>> /* ---------------------------------- */ /* --- PLAYER BODY PARTS --- */ /* ---------------------------------- */ <<set $bodyParts = { gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis" }>> /* ---------------------------------- */ /* --- PLAYER TRAITS & SKILLS --- */ /* ---------------------------------- */ <<set $physicalTraits = []>> <<set $mentalTraits = []>> <<set $selectedTraits = []>> <<set $skills = []>> /* Available physical traits */ <<set $availablePhysicalTraits = { "Tall": "Above average height", "Short": "Below average height", "Curvy": "Curved body shape", "Lean": "Thin and fit", "Muscular": "Well-defined muscles", "Soft": "Soft body texture", "Sharp Features": "Defined facial features", "Smooth Skin": "Very smooth skin", "Scarred": "Visible scars", "Pierced": "Body piercings", "Youthful": "Young appearance", "Mature": "Mature appearance", "Tan Skin": "Tanned complexion", "Dark Skin": "Dark complexion", "Pale Skin": "Pale complexion", "Attractive": "Very attractive appearance", "Plain": "Unremarkable appearance", "Ugly": "Unattractive appearance", "Fit": "In good physical shape", "Overweight": "Above healthy weight", "Underweight": "Below healthy weight", "Graceful": "Moves with elegance", "Clumsy": "Accident-prone", "Strong": "Physically powerful", "Weak": "Physically frail", "Flexible": "Very limber", "Stiff": "Poor flexibility", "Blemished": "Visible skin imperfections", "Freckled": "Freckled complexion", "Tattooed": "Has tattoos", "Athletic Build": "Sporty physique", "Petite": "Small frame", "Voluptuous": "Full figure", "Broad-shouldered": "Wide shoulders", "Quick": "Fast movements", "Sturdy": "Solid build", "Fashionable": "Stylish appearance", "Quick Reflexes": "Fast reactions", "Fast": "High speed", "Slow": "Low speed" }>> /* Available voice traits */ <<set $availableVoiceTraits = { "Smooth Voice": "Pleasant vocal quality", "Soft-Spoken": "Quiet speaker", "Warm Tone": "Friendly vocal warmth", "Gentle Voice": "Soothing speech", "Soothing Tone": "Calming voice", "Silky Voice": "Smooth vocal texture", "Clear Enunciation": "Precise pronunciation", "Articulate Speech": "Well-spoken", "Smooth Talker": "Persuasive speaker", "Friendly Tone": "Welcoming voice", "Charismatic Voice": "Captivating speech", "Steady Voice": "Consistent tone", "Pleasant Cadence": "Nice rhythm", "Calm Voice": "Peaceful tone", "Expressive Voice": "Emotional speech", "Animated Tone": "Lively speaking", "Lively Tone": "Energetic voice", "Charming Tone": "Appealing speech", "Hushed Intimate Voice": "Soft private tone", "Balanced Neutral Tone": "Even speaking", "Sing-Songy Voice": "Musical speech", "Eager Tone": "Enthusiastic voice", "Bouncy Tone": "Upbeat speaking", "Melodic Voice": "Song-like quality", "Clear Pronunciation": "Easy to understand", "Even-Paced Voice": "Steady rhythm", "Understated Voice": "Subtle tone", "Soft Monologue Style": "Narrative speech", "Fast Talker": "Rapid speech", "Rapid-Fire Speech": "Very quick talking", "Deep Voice": "Low pitch", "High-Pitched Tone": "High voice", "Raspy Voice": "Rough vocal quality", "Gravelly Voice": "Coarse tone", "Croaky Voice": "Hoarse speech", "Breathy Voice": "Airy speaking", "Nasally Tone": "Nasal quality", "Stoic Tone": "Unemotional voice", "Measured Speech": "Careful speaking", "Choppy Speech": "Broken rhythm", "Interruptive Tone": "Cuts in often", "Sharp Voice": "Pointed tone", "Snappy Tone": "Curt speech", "Flat Voice": "Monotonous", "Monotone": "No variation", "Deadpan Delivery": "Expressionless speech", "Detached Voice": "Distant tone", "Emotionless Tone": "No feeling", "Slow Calm Voice": "Unhurried speech", "Lazy Drawl": "Slow drawling", "Mumbly Voice": "Unclear speech", "Stuttering Speech": "Hesitant talking", "Grim Tone": "Dark voice", "Robotic Tone": "Mechanical speech", "Shaky Voice": "Trembling speech" }>> /* Available mental traits */ <<set $availableMentalTraits = { "Extroverted": "Outgoing and social", "Introverted": "Reserved and quiet", "Bitchy": "Abrasive personality", "Kind": "Compassionate nature", "Sly": "Cunning and deceptive", "Honest": "Truthful and direct", "Dominant": "Assertive personality", "Submissive": "Compliant nature", "Confident": "Self-assured", "Shy": "Timid and reserved", "Aggressive": "Confrontational", "Passive": "Non-confrontational", "Optimistic": "Positive outlook", "Pessimistic": "Negative outlook", "Cruel": "Enjoys causing pain", "Empathetic": "Understanding of others", "Stubborn": "Refuses to change", "Flexible": "Adapts easily", "Jealous": "Envious of others", "Supportive": "Helpful to others", "Friendly": "Warm and approachable", "Competitive": "Driven to win", "Logical": "Rational thinker", "Shrewd": "Clever and calculating", "Lazy": "Avoids work", "Hardworking": "Diligent and dedicated", "Arrogant": "Overly proud", "Humble": "Modest and unassuming", "Paranoid": "Overly suspicious", "Trusting": "Believes in others", "Ambitious": "Driven to succeed", "Complacent": "Satisfied with mediocrity", "Creative": "Imaginative thinker", "Dull": "Lacks imagination", "Brave": "Courageous", "Cowardly": "Fearful and timid", "Mature": "Acts with maturity", "Immature": "Childish behavior", "Patient": "Tolerant and calm", "Impatient": "Quick to anger", "Wise": "Shows good judgment", "Foolish": "Makes poor decisions", "Intelligent": "Smart and quick-witted", "Analytical": "Logical problem solver", "Outgoing": "Sociable and talkative", "Curious": "Eager to learn", "Witty": "Clever and humorous", "Calm": "Composed and peaceful", "Energetic": "Full of energy", "Thoughtful": "Considerate of others", "Chill": "Relaxed and easy-going", "Nonchalant": "Casually calm", "Charming": "Naturally appealing", "Diplomatic": "Tactful negotiator", "Organized": "Well-structured", "Resourceful": "Finds solutions", "Focused": "Concentrates well", "Disciplined": "Self-controlled", "Determined": "Won't give up", "Steadfast": "Unwavering", "Considerate": "Thoughtful of others", "Polite": "Well-mannered", "Funny": "Makes others laugh", "Reassuring": "Comforting presence", "Loyal": "Faithful and devoted", "Talkative": "Speaks a lot", "Direct": "Straightforward", "Efficient": "Gets things done", "Negotiator": "Skilled bargainer", "Crafty": "Cleverly creative", "Workaholic": "Works excessively", "High Stamina": "Great endurance", "Flirty": "Playfully romantic", "Seductive": "Sexually appealing", "Alluring": "Mysteriously attractive", "Warm": "Emotionally welcoming", "Bookworm": "Loves reading", "Lucky": "Good fortune", "Unlucky": "Bad fortune", "Blunt": "Brutally honest", "Perfectionist": "Demands perfection", "Overthinker": "Analyzes too much", "Moody": "Unpredictable emotions", "Unpredictable": "Erratic behavior", "Risk Taker": "Embraces danger", "Impulsive": "Acts without thinking", "Cynical": "Distrustful pessimist", "Quiet": "Doesn't talk much", "Awkward": "Socially uncomfortable", "Tone Deaf": "Can't read situations", "Tease": "Playfully mocking", "Clingy": "Overly attached", "Sensitive": "Easily hurt", "Corporate Drone": "Bland office worker", "Forgetful": "Poor memory", "Disorganized": "Messy and chaotic", "Selfish": "Self-centered", "Deceitful": "Dishonest and lying", "Erratic": "Unstable behavior", "Obsessive": "Fixates unhealthily", "Insecure": "Lacks confidence", "Short Tempered": "Easily angered", "Rude": "Disrespectful", "Unreliable": "Can't be trusted", "Slow Learner": "Struggles to learn", "Reckless": "Dangerously careless", "Cold": "Emotionally distant", "Insensitive": "Doesn't care", "Unskilled": "Lacks abilities", "High Energy": "Constantly energetic", "Deep Thinker": "Philosophical mind", "Monotone Expression": "Shows no emotion", "Sarcastic": "Uses irony often", "Artistic": "Creative vision", "Relaxed": "Laid-back attitude", "Humorous": "Funny personality", "Perceptive": "Notices details", "Detail-Oriented": "Focuses on specifics", "Customer-Focused": "Service-minded", "Punctual": "Always on time", "Naive": "Innocent and trusting", "Tech Savvy": "Good with technology" }>> /* Stereotype traits */ <<set $stereotypeTraits = { "Nerd": "Academically focused", "Geek": "Obsessed with hobbies", "Prep": "Popular and preppy", "Tomboy": "Masculine interests", "Femboy": "Feminine presentation", "Diva": "Demanding personality", "Goth": "Dark aesthetic" }>> /* Available skills */ <<set $availableSkills = { "Math Skills": "Good with numbers", "Coding": "Programming ability", "Dancing": "Skilled dancer", "Plumbing": "Fix pipes and drains", "High Heels Proficient": "Walk in heels easily", "Swimmer": "Strong swimming ability", "Swimming": "Strong swimming ability", "Sexually Skilled": "Experienced in intimacy", "Modeling": "Posing and presentation", "Makeup": "Cosmetics application", "Cooking": "Culinary skills", "Photography": "Camera and composition", "Maid": "Cleaning and service", "Singing": "Vocal talent", "Serving": "Food and beverage service", "Hair Styling": "Hair cutting and styling", "Cleaning": "Tidying and organizing", "Combat": "Fighting skills", "Persuasion": "Convincing others", "Medicine": "Medical knowledge", "Trading": "Negotiation skills", "Stealth": "Moving unseen", "Driving": "Vehicle operation", "Lock Picking": "Opening locks", "First Aid": "Basic medical care", "Gardening": "Plant cultivation", "Construction": "Building skills", "Heavy Lifting": "Moving heavy objects", "Social Media": "Online presence management", "Baking": "Pastry and bread making", "Public Speaking": "Confident speaker", "Writing": "Creative and technical writing", "Art": "Artistic ability", "Painting": "Visual art creation", "Music": "Musical talent", "Guitar": "String instrument", "Piano": "Keyboard instrument", "Acting": "Performance skills", "Teaching": "Educating others", "Sales": "Selling products", "Management": "Leadership skills", "Accounting": "Financial management", "Legal Knowledge": "Understanding of law", "Foreign Language": "Speaks another language", "Languages": "Multilingual ability", "Martial Arts": "Combat training", "Athletics": "Physical sports", "Yoga": "Flexibility and balance", "Retail": "Store operations", "Tech-Savvy": "Technology expertise", "Troubleshooting": "Problem diagnosis", "Forklift Certified": "Heavy machinery", "Product Knowledge": "Item expertise", "Inventory Management": "Stock control", "Customer Service": "Client assistance", "Meditation": "Mindfulness practice", "Business": "Commercial acumen", "Finance": "Money management", "Investigation": "Research skills", "Fishing": "Angling ability", "Mechanical Repair": "Fix machines", "Basketball": "Court sports", "Performance": "Stage presence", "Gaming": "Video game skills", "Leadership": "Guiding others", "Combat Training": "Fight instruction", "Quick Learner": "Learn skills faster. Gain +50% experience from all activities." }>> /* ---------------------------------- */ /* --- PLAYER STATUS --- */ /* ---------------------------------- */ <<set $homeless = true>> <<set $jobs = []>> <<set $money = 0>> <</silently>> /* ---------------------------------- */ /* --- SHADY SHOP TRACKING --- */ /* ---------------------------------- */ <<set $shadyDealsToday = 0>> <<set $lastFenRisTrainingDay = -1>> /* ---------------------------------- */ /* --- RELATIONSHIP SYSTEM --- */ /* ---------------------------------- */ <<set setup.relationshipLevels = [ {level: 1, name: "Stranger", minXp: 0, maxXp: 20, color: "#666666"}, {level: 2, name: "Acquaintance", minXp: 20, maxXp: 70, color: "#51cf66"}, {level: 3, name: "Friend", minXp: 70, maxXp: 170, color: "#4dabf7"}, {level: 4, name: "Close Friend", minXp: 170, maxXp: 420, color: "#9b59b6"}, {level: 5, name: "Best Friend", minXp: 420, maxXp: 920, color: "#ff6b9d"} ]>> /* Initialize relationships for ALL NPCs */ <<set $npcRelationships = {}>> /* Add all NPCs from the $npcs array to relationships */ <<for _i = 0; _i < $npcs.length; _i++>> <<set _npcName = $npcs[_i].name>> <<set $npcRelationships[_npcName] = { level: 1, xp: 0, maxXp: 20, levelName: "Stranger", bestFriendUnlocked: false }>> <</for>> /* Function to add relationship XP */ <<set setup.addRelationshipXP = function(npcName, xpAmount) { var v = State.variables; if (!v.npcRelationships[npcName]) { v.npcRelationships[npcName] = { level: 1, xp: 0, maxXp: 20, levelName: "Stranger", bestFriendUnlocked: false }; } var rel = v.npcRelationships[npcName]; rel.xp += xpAmount; // Level up logic while (rel.xp >= rel.maxXp && rel.level < 5) { rel.level++; var levelData = setup.relationshipLevels[rel.level - 1]; rel.levelName = levelData.name; rel.maxXp = levelData.maxXp - levelData.minXp; rel.xp = rel.xp - (setup.relationshipLevels[rel.level - 2].maxXp - setup.relationshipLevels[rel.level - 2].minXp); } // Cap at max XP for level 5 if not unlocked if (rel.level === 5 && !rel.bestFriendUnlocked && rel.xp >= rel.maxXp) { rel.xp = rel.maxXp; } }>> /* Function to unlock Best Friend status */ <<set setup.unlockBestFriendStatus = function(npcName) { var v = State.variables; if (v.npcRelationships[npcName] && v.npcRelationships[npcName].level === 5) { v.npcRelationships[npcName].bestFriendUnlocked = true; v.npcRelationships[npcName].levelName = "Best Friend"; } }>> /* Function to get relationship color */ <<set setup.getRelationshipColor = function(level) { return setup.relationshipLevels[level - 1].color; }>> /* Function to update relationship name when name is traded */ <<set setup.updateRelationshipName = function(oldName, newName) { var v = State.variables; if (v.npcRelationships && v.npcRelationships[oldName]) { v.npcRelationships[newName] = v.npcRelationships[oldName]; delete v.npcRelationships[oldName]; return true; } return false; }>> /* Track daily conversations */ <<set $dailyConversations = {}>> <<set $lastConversationDay = 0>> <<if $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 1>> <</if>>
test
:: InitTimeSystem <<silently>> /* ---------------------------------- */ /* --- TIME & DAY TRACKING --- */ /* ---------------------------------- */ <<set $timeInMinutes = 480>> /* Start at 8:00 AM */ <<set $dayOfWeek = "Monday">> <<set $dayNumber = 1>> <<set $weekNumber = 1>> <<set $dayOrder = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]>> /* ---------------------------------- */ /* --- TRADE LIMITS --- */ /* ---------------------------------- */ <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> /* ---------------------------------- */ /* --- WORK TRACKING --- */ /* ---------------------------------- */ <<set $hoursWorkedToday = 0>> <<set $lastWorkDay = 0>> <</silently>> /* Ensure all NPCs have hair length on game load */ <<set setup.ensureAllNPCsHaveHairLength = function() { var v = State.variables; if (v.npcs && v.npcs.length > 0) { v.npcs.forEach(function(npc) { if (!npc.appearance.hairLength) { npc.appearance.hairLength = Math.random() < 0.5 ? "short" : "long"; // Remove any existing hair length traits first npc.physicalTraits.delete("Short Hair"); npc.physicalTraits.delete("Long Hair"); // Add correct trait var hairLengthTrait = npc.appearance.hairLength === "short" ? "Short Hair" : "Long Hair"; if (!npc.physicalTraits.includes(hairLengthTrait)) { npc.physicalTraits.push(hairLengthTrait); } } }); } }>> /* Run the check immediately */ <<run setup.ensureAllNPCsHaveHairLength()>>
<<nobr>> /* Safety check - if this is somehow the first passage, redirect to actual start */ <<if visited() === 1 && tags().includes("start")>> <<goto "Start">> <</if>> <h1>🛍️ Sunfish City Mall - CLOSED</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 20px;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> ⏰ The mall is currently closed. </p> </div> <div style="padding: 20px; background: #3d3d3d; border-radius: 10px; text-align: center; color: #e0e0e0;"> <h2 style="color: #ffffff;">Mall Hours</h2> <p style="font-size: 18px; color: #cccccc;"> <strong>Open:</strong> 9:00 AM - 5:00 PM<br> <strong>Current Time:</strong> <<= getTimeString()>> </p> <p style="color: #aaaaaa; margin-top: 20px;"> The mall opens at 9:00 AM and closes at 5:00 PM. Come back during business hours! </p> </div> <br> <div style="text-align: center;"> [[Leave|BusinessDistrict]] </div> <</nobr>>
<<nobr>> <<set _relColor = "#667eea">> <!-- Password Check --> <<if !$cheatMenuUnlocked>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 15px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); max-width: 500px; text-align: center;"> <h1 style="color: #667eea; margin: 0 0 20px 0;">🔒 Cheat Menu Access</h1> <div style="background-color: #0a0a0a; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ffd43b;"> <p style="color: #ffd43b; font-size: 18px; font-weight: bold; margin: 0;">⭐ Patreon Tiers Spoon and up can access the cheat menu! ⭐</p> </div> <p style="color: #e0e0e0; margin-bottom: 20px; font-size: 16px;">Enter the password to continue:</p> <div style="margin-bottom: 20px;"> <<textbox "_cheatPassword" "Who am I?" "autofocus">> </div> <span id="passwordError" style="color: #ff6b6b; font-size: 14px; display: none; margin-bottom: 15px;">❌ Incorrect password. Please try again.</span> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px 30px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: inline-block; margin-top: 10px;'>Unlock</div>">> <<set _correctPassword = "Uno remaining on this stage, I am the only one I am my biggest fan I am my biggest fan I am my enemy and my friend">> /* Are you really using inspect element to find the password? smh. */ <<if _cheatPassword === _correctPassword>> <<set $cheatMenuUnlocked = true>> <<goto "Debug">> <<else>> <<run $("#passwordError").show()>> <</if>> <</link>> <div style="margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 10px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: inline-block;'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _relColor>> 0%, <<= _relColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _relColor>>; box-shadow: 0 0 20px <<= _relColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">⚙️ Cheat Menu</h1> <p style="color: rgba(255,255,255,0.9); text-align: center; margin: 10px 0 0 0; font-size: 14px;">Select a category to modify game settings</p> </div> <!-- Category Grid --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Date and Time --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #4dabf7; margin: 0 0 10px 0; text-align: center;'>⏰ Date and Time</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Adjust game time and date</p></div>" "DebugDateTime">><</link>> <!-- Stats and Appearance --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff6b6b44; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ff6b6b; margin: 0 0 10px 0; text-align: center;'>📊 Stats & Appearance</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Modify stats, body, and looks</p></div>" "DebugStatsAppearance">><</link>> <!-- Housing and Tech --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #51cf6644; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #51cf66; margin: 0 0 10px 0; text-align: center;'>🏠 Housing & Tech</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage apartment and equipment</p></div>" "DebugHousingTech">><</link>> <!-- Streaming --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff634744; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ff6347; margin: 0 0 10px 0; text-align: center;'>📹 Streaming</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Streaming settings and stats</p></div>" "DebugStreaming">><</link>> <!-- Relationships --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e91e6344; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #e91e63; margin: 0 0 10px 0; text-align: center;'>💕 Relationships</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage NPC relationships</p></div>" "DebugRelationships">><</link>> <!-- Traits, Skills, and Jobs --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #9b59b6; margin: 0 0 10px 0; text-align: center;'>⚡ Traits, Skills & Jobs</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Modify traits, skills, and job</p></div>" "DebugTraitsSkillsJobs">><</link>> </div> <!-- Money Quick Access --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd43b44; margin-bottom: 20px;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0; text-align: center;">💰 Quick Money Access</h2> <!-- Current Money Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 18px; margin: 0; text-align: center;"> <strong>Current Money:</strong> <span id="currentMoney" style="color: #51cf66;">$<<= $money.toLocaleString()>></span> </p> </div> <!-- Add Money Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">➕ Add Money</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$100</div>">> <<set $money += 100>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$500</div>">> <<set $money += 500>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$1,000</div>">> <<set $money += 1000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$5,000</div>">> <<set $money += 5000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$10,000</div>">> <<set $money += 10000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$25,000</div>">> <<set $money += 25000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$50,000</div>">> <<set $money += 50000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$100,000</div>">> <<set $money += 100000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> <!-- Subtract Money Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">➖ Subtract Money</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$100</div>">> <<set $money -= 100>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$500</div>">> <<set $money -= 500>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$1,000</div>">> <<set $money -= 1000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$5,000</div>">> <<set $money -= 5000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$10,000</div>">> <<set $money -= 10000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$25,000</div>">> <<set $money -= 25000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$50,000</div>">> <<set $money -= 50000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$100,000</div>">> <<set $money -= 100000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> <!-- Set to Specific Amount Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ffd43b; margin: 0 0 10px 0; text-align: center;">💵 Set to Amount</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$0</div>">> <<set $money = 0>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$1,000</div>">> <<set $money = 1000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$5,000</div>">> <<set $money = 5000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$10,000</div>">> <<set $money = 10000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$25,000</div>">> <<set $money = 25000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$50,000</div>">> <<set $money = 50000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$100,000</div>">> <<set $money = 100000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</if>> <</nobr>>
/* This passage runs before StoryInit */ /* IMPORTANT: This passage MUST have the tag "script" */ /* NPC Generation Function */ setup.generateNPC = function(name, jobs, overrides) { var genders = ["male", "female"]; var skinTones = ["pale", "tan", "dark"]; var hairColors = ["Black", "Brown", "Blonde", "Red", "Platinum Blonde"]; var hairStyles = ["messy", "short", "long", "ponytail"]; var physiques = ["slim", "athletic", "stocky", "average"]; var chestSizes = ["flat", "small", "medium", "large", "huge"]; var buttSizes = ["flat", "small", "medium", "large", "huge"]; var skills = ["Cooking", "Singing", "Dancing", "Painting", "Writing", "Photography", "Guitar", "Piano", "Coding", "Math Skills", "Languages", "Public Speaking", "Athletics", "Yoga", "Swimming", "Martial Arts", "Heavy Lifting", "Combat", "Persuasion", "Medicine", "Trading", "Stealth", "Driving", "Lock Picking", "First Aid", "Gardening", "Construction", "Social Media", "Baking", "Sexually Skilled", "Modeling", "Makeup", "High Heels Proficient", "Hair Styling", "Cleaning", "Maid", "Serving", "Plumbing"]; var physicalTraits = ["Tall", "Short", "Muscular", "Curvy", "Petite", "Broad-shouldered", "Flexible", "Strong", "Quick", "Graceful", "Sturdy", "Lean", "Soft", "Sharp Features", "Smooth Skin", "Scarred", "Pierced", "Youthful", "Mature", "Tattooed"]; var mentalTraits = ["Intelligent", "Creative", "Analytical", "Empathetic", "Confident", "Shy", "Outgoing", "Patient", "Ambitious", "Curious", "Witty", "Calm", "Energetic", "Thoughtful", "Competitive", "Friendly", "Logical", "Shrewd", "Extroverted", "Introverted", "Bitchy", "Kind", "Sly", "Honest", "Dominant", "Submissive", "Aggressive", "Passive", "Optimistic", "Pessimistic", "Cruel", "Stubborn", "Jealous", "Supportive", "Lazy", "Hardworking", "Arrogant", "Humble", "Paranoid", "Trusting", "Complacent", "Dull", "Brave", "Cowardly", "Immature", "Impatient", "Wise", "Foolish", "Nonchalant", "Charming", "Diplomatic", "Organized", "Resourceful", "Focused", "Disciplined", "Determined", "Steadfast", "Considerate", "Blunt", "Perfectionist", "Overthinker", "Moody", "Unpredictable", "Risk Taker", "Impulsive", "Cynical", "Forgetful", "Disorganized", "Selfish", "Deceitful", "Erratic", "Obsessive", "Insecure", "Short Tempered", "Polite", "Funny", "Reassuring", "Loyal", "Talkative", "Direct", "Quiet", "Rude", "Awkward", "Tone Deaf", "Efficient", "Negotiator", "Crafty", "Workaholic", "Unreliable", "Slow Learner", "High Stamina", "Reckless", "Flirty", "Seductive", "Alluring", "Warm", "Cold", "Tease", "Clingy", "Insensitive", "Sensitive", "Bookworm", "Unskilled", "Corporate Drone", "Lucky", "Unlucky", "Nerd", "Geek", "Jock", "Prep", "Tomboy", "Femboy", "Diva", "Goth"]; "Empathetic", "Confident", "Shy", "Outgoing", "Patient", "Ambitious", "Curious", "Witty", "Calm", "Energetic", "Thoughtful", "Competitive", "Friendly", "Logical", "Shrewd", "Extroverted", "Introverted", "Bitchy", "Kind", "Sly", "Honest", "Dominant", "Submissive", "Aggressive", "Passive", "Optimistic", "Pessimistic", "Cruel", "Stubborn", "Flexible", "Jealous", "Supportive"]; /* Add character creation traits to possible mental traits */ var characterTraits = ["Quick Learner", "Swift", "Silver-Tongued", "Pensive", "Jock", "Naturally Gifted"]; function getRandomItems(array, count) { var shuffled = array.sort(function() { return 0.5 - Math.random(); }); return shuffled.slice(0, count); } function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var gender = genders[Math.floor(Math.random() * genders.length)]; var skinTone = skinTones[Math.floor(Math.random() * skinTones.length)]; /* Generate stats (1-20, capped at 12 unless professional) */ var jobData = State.variables.availableJobs[Array.isArray(jobs) ? jobs[0] : jobs]; var isProfessional = jobData && jobData.income >= 5; var statMax = isProfessional ? 20 : 12; var npcStats = { charisma: getRandomInt(1, statMax), dexterity: getRandomInt(1, statMax), strength: getRandomInt(1, statMax), intelligence: getRandomInt(1, statMax) }; /* Initialize NPC stat max caps */ var npcStatMaxCaps = { charisma: 20, dexterity: 20, strength: 20, intelligence: 20 }; /* Generate hard traits (randomized difficulty) */ var hardTraits = {}; var allSkills = overrides && overrides.skills ? overrides.skills : getRandomItems(skills, getRandomInt(2, 5)); var allPhysicalTraits = getRandomItems(physicalTraits, getRandomInt(2, 4)); /* Mental traits - randomly include character creation traits */ var baseMentalTraits = overrides && overrides.mentalTraits ? overrides.mentalTraits : getRandomItems(mentalTraits, getRandomInt(2, 4)); var allMentalTraits = baseMentalTraits.slice(); /* 20% chance to have one character creation trait */ if (Math.random() < 0.2) { var charTrait = characterTraits[Math.floor(Math.random() * characterTraits.length)]; allMentalTraits.push(charTrait); } /* Randomize difficulty for each trait */ allSkills.forEach(function(skill) { hardTraits["skill:" + skill] = getRandomInt(0, 40); }); allPhysicalTraits.forEach(function(trait) { hardTraits["physical:" + trait] = getRandomInt(0, 40); }); allMentalTraits.forEach(function(trait) { hardTraits["mental:" + trait] = getRandomInt(0, 40); }); ["charisma", "dexterity", "strength", "intelligence"].forEach(function(stat) { hardTraits["stat:" + stat] = getRandomInt(0, 40); }); ["chest", "butt", "gender"].forEach(function(bodyPart) { hardTraits["bodyPart:" + bodyPart] = getRandomInt(10, 50); }); var npc = { name: name, jobs: Array.isArray(jobs) ? jobs : [jobs], stats: npcStats, statMaxCaps: npcStatMaxCaps, bodyParts: { gender: gender, chest: chestSizes[Math.floor(Math.random() * chestSizes.length)], butt: buttSizes[Math.floor(Math.random() * buttSizes.length)] }, appearance: { skinTone: skinTone, hairColor: hairColors[Math.floor(Math.random() * hairColors.length)], hairStyle: hairStyles[Math.floor(Math.random() * hairStyles.length)], physique: physiques[Math.floor(Math.random() * physiques.length)] }, skills: allSkills, physicalTraits: allPhysicalTraits, mentalTraits: allMentalTraits, hardTraits: hardTraits }; /* Apply bonuses from character creation traits */ allMentalTraits.forEach(function(trait) { if (setup.traitBonuses && setup.traitBonuses[trait]) { setup.applyTraitBonus(trait, npc); } }); return npc; };
:: InitNPCData <<silently>> /* ================================== */ /* === NPC HELPER FUNCTIONS === */ /* ================================== */ <<set setup.findNPCByName = function(name) { var v = State.variables; for (var i = 0; i < v.npcs.length; i++) { if (v.npcs[i].name === name) { return v.npcs[i]; } } return null; }>> /* ---------------------------------- */ /* --- MANUAL NPC CREATION FUNCTION --- */ /* ---------------------------------- */ <<set setup.createNPC = function(config) { var skinTones = ["pale", "tan", "dark"]; var hairColors = ["Black", "Brown", "Blonde", "Red", "Platinum Blonde"]; var hairStyles = ["messy", "short", "long"]; var ages = ["Adult", "Mature Adult"]; // Determine hair length and add corresponding trait var hairLength = config.hairLength || (config.gender === "female" ? "long" : "short"); var hairLengthTrait = hairLength === "short" ? "Short Hair" : "Long Hair"; // Add hair length trait to physical traits var allPhysicalTraits = config.physicalTraits.slice(); if (!allPhysicalTraits.includes(hairLengthTrait)) { allPhysicalTraits.push(hairLengthTrait); } // Calculate stats from job requirements var jobName = Array.isArray(config.jobs) ? config.jobs[0] : config.jobs; var jobReqs = setup.jobRequirements[jobName] || {}; var npcStats = { charisma: config.baseStats.charisma || 15, dexterity: config.baseStats.dexterity || 15, strength: config.baseStats.strength || 15, intelligence: config.baseStats.intelligence || 15 }; // Ensure stats meet job requirements for (var stat in jobReqs) { if (npcStats[stat] < jobReqs[stat]) { npcStats[stat] = jobReqs[stat]; } } var npc = { name: config.name, originalName: config.name, // Store original name for image paths jobs: Array.isArray(config.jobs) ? config.jobs : [config.jobs], stats: npcStats, statMaxCaps: { charisma: 100, dexterity: 100, strength: 100, intelligence: 100 }, bodyParts: { gender: config.gender, chest: config.chest, butt: config.butt, genitals: config.genitals || "penis" }, appearance: { skinTone: config.skinTone || skinTones[Math.floor(Math.random() * skinTones.length)], hairColor: config.hairColor || hairColors[Math.floor(Math.random() * hairColors.length)], hairStyle: config.hairStyle || hairStyles[Math.floor(Math.random() * hairStyles.length)], hairLength: hairLength, physique: config.physique || "average", age: config.age || ages[Math.floor(Math.random() * ages.length)] }, skills: config.skills, physicalTraits: allPhysicalTraits, mentalTraits: config.mentalTraits, hardTraits: {} }; // Generate hard traits function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } npc.skills.forEach(function(skill) { npc.hardTraits["skill:" + skill] = getRandomInt(0, 40); }); npc.physicalTraits.forEach(function(trait) { npc.hardTraits["physical:" + trait] = getRandomInt(0, 40); }); npc.mentalTraits.forEach(function(trait) { npc.hardTraits["mental:" + trait] = getRandomInt(0, 40); }); ["charisma", "dexterity", "strength", "intelligence"].forEach(function(stat) { npc.hardTraits["stat:" + stat] = getRandomInt(0, 40); }); ["chest", "butt", "gender"].forEach(function(bodyPart) { npc.hardTraits["bodyPart:" + bodyPart] = getRandomInt(10, 50); }); // Apply trait bonuses npc.mentalTraits.forEach(function(trait) { if (setup.traitBonuses && setup.traitBonuses[trait]) { setup.applyTraitBonus(trait, npc); } }); npc.physicalTraits.forEach(function(trait) { if (setup.traitBonuses && setup.traitBonuses[trait]) { setup.applyTraitBonus(trait, npc); } }); npc.skills.forEach(function(skill) { if (setup.skillBonuses && setup.skillBonuses[skill]) { setup.applyTraitBonus(skill, npc); } }); return npc; }>> /* ---------------------------------- */ /* --- CREATE NPCs --- */ /* ---------------------------------- */ /* Marcus Carter - Security Guard */ <<run $npcs.push(setup.createNPC({ name: "Marcus Carter", jobs: "Security Guard", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 20, dexterity: 15, strength: 25, intelligence: 15}, physicalTraits: ["Muscular", "Tall", "Strong", "Broad-shouldered"], mentalTraits: ["Confident", "Outgoing", "Brave", "Charming"], skills: ["Combat", "Athletics", "Public Speaking", "Acting", "Guitar"], skinTone: "tan", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Elena Romero - Clinic Assistant & Data Analyst */ <<run $npcs.push(setup.createNPC({ name: "Elena Romero", jobs: ["Clinic Assistant", "Data Analyst"], gender: "female", chest: "small", butt: "small", genitals: "tight vagina", baseStats: {charisma: 20, dexterity: 20, strength: 10, intelligence: 55}, physicalTraits: ["Graceful", "Youthful", "Sharp Features"], mentalTraits: ["Intelligent", "Analytical", "Patient", "Kind", "Nerd", "Shy"], skills: ["Medicine", "First Aid", "Coding", "Math Skills", "Painting"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Silva Silva - Package Courier & Negotiator */ <<run $npcs.push(setup.createNPC({ name: "Silva Silva", jobs: ["Package Courier", "Negotiator"], gender: "female", chest: "medium", butt: "medium", genitals: "vagina", baseStats: {charisma: 55, dexterity: 20, strength: 15, intelligence: 20}, physicalTraits: ["Quick", "Lean", "Athletic Build", "Fashionable"], mentalTraits: ["Shrewd", "Confident", "Ambitious", "Diplomatic"], skills: ["Driving", "Athletics", "Persuasion", "Public Speaking", "Languages"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Grimm Patel - Negotiator & Enforcer */ <<run $npcs.push(setup.createNPC({ name: "Grimm Patel", jobs: ["Negotiator", "Enforcer"], gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 55, dexterity: 20, strength: 55, intelligence: 20}, physicalTraits: ["Muscular", "Strong", "Scarred", "Sharp Features"], mentalTraits: ["Dominant", "Shrewd", "Stubborn", "Cynical", "Intimidating"], skills: ["Combat", "Stealth", "Persuasion", "Public Speaking", "Cooking"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult" }))>> /* Scarlett Vex - Porn Star */ <<run $npcs.push(setup.createNPC({ name: "Scarlett Vex", jobs: "Porn Star", gender: "female", chest: "huge", butt: "huge", genitals: "loose vagina", baseStats: {charisma: 60, dexterity: 25, strength: 15, intelligence: 15}, physicalTraits: ["Attractive", "Voluptuous", "Fit", "Smooth Skin"], mentalTraits: ["Confident", "Outgoing", "Ambitious", "Seductive", "Arrogant"], skills: ["Sexually Skilled", "Acting", "Modeling", "High Heels Proficient", "Dancing", "Photography"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Jade Nightshade - Stripper */ <<run $npcs.push(setup.createNPC({ name: "Jade Nightshade", jobs: "Stripper", gender: "female", chest: "large", butt: "large", genitals: "vagina", baseStats: {charisma: 40, dexterity: 30, strength: 15, intelligence: 15}, physicalTraits: ["Attractive", "Flexible", "Graceful", "Curvy"], mentalTraits: ["Sly", "Confident", "Creative", "Flirty", "Manipulative"], skills: ["Dancing", "Sexually Skilled", "High Heels Proficient", "Acting", "Singing"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Apollo Sterling - Stripper */ <<run $npcs.push(setup.createNPC({ name: "Apollo Sterling", jobs: "Stripper", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 45, dexterity: 30, strength: 25, intelligence: 15}, physicalTraits: ["Attractive", "Muscular", "Flexible", "Graceful"], mentalTraits: ["Confident", "Outgoing", "Creative", "Charming", "Vain"], skills: ["Dancing", "Sexually Skilled", "Modeling", "Athletics", "Music"], skinTone: "pale", hairColor: "Blonde", hairLength: "short", age: "Adult" }))>> /* Diamond Murphy - Hooker */ <<run $npcs.push(setup.createNPC({ name: "Diamond Murphy", jobs: "Hooker", gender: "female", chest: "large", butt: "large", genitals: "loose vagina", baseStats: {charisma: 35, dexterity: 20, strength: 15, intelligence: 15}, physicalTraits: ["Attractive", "Curvy", "Tattooed"], mentalTraits: ["Sly", "Hardworking", "Stubborn", "Selfish", "Street Smart"], skills: ["Sexually Skilled", "Persuasion", "Stealth", "Baking"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Tank Morrison - Bouncer */ <<run $npcs.push(setup.createNPC({ name: "Tank Morrison", jobs: "Bouncer", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 20, dexterity: 20, strength: 50, intelligence: 15}, physicalTraits: ["Muscular", "Tall", "Strong", "Broad-shouldered", "Scarred"], mentalTraits: ["Brave", "Calm", "Honest", "Loyal", "Protective"], skills: ["Combat", "Heavy Lifting", "Athletics", "Cooking"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult" }))>> /* Candace Luxe - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Candace Luxe", jobs: "Brothel Worker", gender: "female", chest: "huge", butt: "huge", genitals: "loose vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Voluptuous", "Smooth Skin", "Pierced"], mentalTraits: ["Confident", "Friendly", "Empathetic", "Warm", "Nurturing"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Dancing", "Painting"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Ruby Becker - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Ruby Becker", jobs: "Brothel Worker", gender: "female", chest: "large", butt: "large", genitals: "tight vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Curvy", "Smooth Skin", "Freckled"], mentalTraits: ["Shy", "Kind", "Creative", "Sensitive", "Romantic"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Writing", "Photography"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Sapphire Wallace - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Sapphire Wallace", jobs: "Brothel Worker", gender: "female", chest: "huge", butt: "large", genitals: "vagina", baseStats: {charisma: 42, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Voluptuous", "Smooth Skin", "Tattooed"], mentalTraits: ["Dominant", "Confident", "Ambitious", "Aggressive", "Competitive"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Dancing", "Martial Arts"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Jasmine Abrams - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Jasmine Abrams", jobs: "Brothel Worker", gender: "female", chest: "medium", butt: "huge", genitals: "vagina", baseStats: {charisma: 40, dexterity: 28, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Flexible", "Graceful", "Smooth Skin"], mentalTraits: ["Submissive", "Friendly", "Patient", "Kind", "Gentle"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Dancing", "Yoga"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Ebony Vasquez - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Ebony Vasquez", jobs: "Brothel Worker", gender: "female", chest: "large", butt: "huge", genitals: "vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Curvy", "Smooth Skin"], mentalTraits: ["Sly", "Witty", "Competitive", "Clever", "Playful"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Acting", "Singing"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Amber Skye - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Amber Skye", jobs: "Brothel Worker", gender: "female", chest: "medium", butt: "large", genitals: "tight vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Curvy", "Smooth Skin", "Youthful"], mentalTraits: ["Optimistic", "Energetic", "Curious", "Naive", "Bubbly"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Social Media", "Music"], skinTone: "tan", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Kate Velvet - Brothel Owner */ <<run $npcs.push(setup.createNPC({ name: "Kate Velvet", jobs: "Brothel Owner", gender: "female", chest: "huge", butt: "huge", genitals: "vagina", baseStats: {charisma: 80, dexterity: 25, strength: 20, intelligence: 60}, physicalTraits: ["Attractive", "Mature", "Voluptuous", "Sharp Features"], mentalTraits: ["Dominant", "Shrewd", "Ambitious", "Confident", "Arrogant", "Diva"], skills: ["Management", "Persuasion", "Accounting", "Sexually Skilled", "Languages"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Mature Adult" }))>> /* Bella Carver - Social Media Influencer */ <<run $npcs.push(setup.createNPC({ name: "Bella Carver", jobs: "Social Media Influencer", gender: "female", chest: "large", butt: "large", genitals: "vagina", baseStats: {charisma: 50, dexterity: 25, strength: 15, intelligence: 25}, physicalTraits: ["Attractive", "Youthful", "Curvy", "Fashionable"], mentalTraits: ["Outgoing", "Creative", "Ambitious", "Naive", "Vain", "Prep"], skills: ["Social Media", "Photography", "Modeling", "Acting", "Makeup"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Jake Steel - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Jake Steel", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 15, dexterity: 18, strength: 30, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Broad-shouldered"], mentalTraits: ["Hardworking", "Honest", "Calm", "Loyal", "Simple"], skills: ["Heavy Lifting", "Construction", "Driving", "Fishing"], skinTone: "tan", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Marco Rodriguez - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Marco Rodriguez", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 18, dexterity: 18, strength: 30, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Tattooed"], mentalTraits: ["Friendly", "Competitive", "Brave", "Hot-Headed", "Passionate"], skills: ["Heavy Lifting", "Construction", "Cooking", "Guitar"], skinTone: "tan", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Tyrone Washington - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Tyrone Washington", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 20, dexterity: 18, strength: 32, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Broad-shouldered", "Tall"], mentalTraits: ["Outgoing", "Witty", "Confident", "Funny", "Jock"], skills: ["Heavy Lifting", "Construction", "Basketball", "Music"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Sheryl Williams - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Sheryl Williams", jobs: "Construction Worker", gender: "female", chest: "small", butt: "medium", genitals: "tight vagina", baseStats: {charisma: 18, dexterity: 20, strength: 30, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Athletic Build"], mentalTraits: ["Hardworking", "Stubborn", "Brave", "Direct", "Tomboy"], skills: ["Heavy Lifting", "Construction", "Martial Arts", "Gardening"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* David O'Brien - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "David O'Brien", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 15, dexterity: 18, strength: 28, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Freckled"], mentalTraits: ["Calm", "Patient", "Thoughtful", "Quiet", "Reserved"], skills: ["Heavy Lifting", "Construction", "Plumbing", "Painting"], skinTone: "pale", hairColor: "Red", hairLength: "short", age: "Mature Adult" }))>> /* Mike Murphy - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Mike Murphy", jobs: "Dock Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 18, dexterity: 20, strength: 32, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered", "Tattooed"], mentalTraits: ["Aggressive", "Competitive", "Brave", "Short Tempered", "Reckless"], skills: ["Heavy Lifting", "Athletics", "Swimming", "Cooking"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Carlos Mendez - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Carlos Mendez", jobs: "Dock Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 20, dexterity: 20, strength: 30, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered"], mentalTraits: ["Friendly", "Outgoing", "Optimistic", "Charming", "Flirty"], skills: ["Heavy Lifting", "Athletics", "Dancing", "Guitar"], skinTone: "tan", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Jamal Rivers - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Jamal Rivers", jobs: "Dock Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 20, dexterity: 22, strength: 32, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered", "Athletic Build"], mentalTraits: ["Ambitious", "Intelligent", "Competitive", "Determined", "Focused"], skills: ["Heavy Lifting", "Athletics", "Basketball", "Writing"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Rosa Otterino - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Rosa Otterino", jobs: "Dock Worker", gender: "female", chest: "small", butt: "medium", genitals: "vagina", baseStats: {charisma: 18, dexterity: 22, strength: 30, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Athletic Build", "Tattooed"], mentalTraits: ["Hardworking", "Honest", "Calm", "Reliable", "Reserved"], skills: ["Heavy Lifting", "Athletics", "Swimming", "Painting"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Keisha Jackson - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Keisha Jackson", jobs: "Dock Worker", gender: "female", chest: "medium", butt: "large", genitals: "vagina", baseStats: {charisma: 22, dexterity: 20, strength: 32, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered", "Curvy"], mentalTraits: ["Confident", "Outgoing", "Brave", "Bold", "Sassy"], skills: ["Heavy Lifting", "Athletics", "Singing", "Cooking"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Dick Richardson - City Mayor */ <<run $npcs.push(setup.createNPC({ name: "Dick Richardson", jobs: "City Mayor", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 90, dexterity: 20, strength: 20, intelligence: 70}, physicalTraits: ["Mature", "Sharp Features"], mentalTraits: ["Arrogant", "Shrewd", "Ambitious", "Dominant", "Selfish", "Corrupt"], skills: ["Public Speaking", "Management", "Legal Knowledge"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Mature Adult" }))>> /* Creo Applesauce - Mayor's Secretary */ <<run $npcs.push(setup.createNPC({ name: "Creo Applesauce", jobs: "Mayor's Secretary", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 60, dexterity: 25, strength: 15, intelligence: 75}, physicalTraits: ["Sharp Features", "Lean"], mentalTraits: ["Intelligent", "Analytical", "Patient", "Submissive", "Anxious", "Nerd"], skills: ["Management", "Accounting", "Coding", "Languages", "Piano"], skinTone: "pale", hairColor: "Blonde", hairLength: "short", age: "Adult" }))>> /* Brad Icus - Fitness Shop Clerk */ <<run $npcs.push(setup.createNPC({ name: "Brad Icus", jobs: "Fitness Shop Clerk", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 30, dexterity: 25, strength: 35, intelligence: 20}, physicalTraits: ["Fit", "Muscular", "Athletic Build", "Attractive"], mentalTraits: ["Energetic", "Friendly", "Optimistic", "Simple", "Jock"], skills: ["Athletics", "Sales", "Heavy Lifting", "Gardening", "Cooking"], skinTone: "tan", hairColor: "Blonde", hairLength: "short", age: "Adult" }))>> /* Raven Bido - Ecentric Shop Worker */ <<run $npcs.push(setup.createNPC({ name: "Raven Bido", jobs: "Ecentric Shop Worker", gender: "female", chest: "small", butt: "small", genitals: "tight vagina", baseStats: {charisma: 25, dexterity: 25, strength: 15, intelligence: 22}, physicalTraits: ["Tattooed", "Pierced", "Lean", "Youthful"], mentalTraits: ["Creative", "Curious", "Introverted", "Cynical", "Goth"], skills: ["Sales", "Art", "Painting", "Music", "Writing"], skinTone: "pale", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Crystal Meffin - Beauty Salon Stylist */ <<run $npcs.push(setup.createNPC({ name: "Crystal Meffin", jobs: "Beauty Salon Stylist", gender: "female", chest: "medium", butt: "medium", genitals: "tight vagina", baseStats: {charisma: 35, dexterity: 35, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Graceful", "Youthful", "Fashionable"], mentalTraits: ["Friendly", "Outgoing", "Creative", "Bubbly", "Prep"], skills: ["Hair Styling", "Makeup", "Art", "Fashion Design", "Photography"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Sophi Boris - Beauty Salon Stylist */ <<run $npcs.push(setup.createNPC({ name: "Sophi Boris", jobs: "Beauty Salon Stylist", gender: "female", chest: "large", butt: "large", genitals: "vagina", baseStats: {charisma: 35, dexterity: 35, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Graceful", "Curvy", "Fashionable"], mentalTraits: ["Confident", "Witty", "Ambitious", "Arrogant", "Diva"], skills: ["Hair Styling", "Makeup", "Dancing", "Singing", "Social Media"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Naomi Light - Beauty Salon Stylist */ <<run $npcs.push(setup.createNPC({ name: "Naomi Light", jobs: "Beauty Salon Stylist", gender: "female", chest: "small", butt: "medium", genitals: "tight vagina", baseStats: {charisma: 35, dexterity: 38, strength: 15, intelligence: 22}, physicalTraits: ["Attractive", "Graceful", "Flexible"], mentalTraits: ["Kind", "Patient", "Empathetic", "Calm", "Spiritual"], skills: ["Hair Styling", "Makeup", "Yoga", "Meditation", "Gardening"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Kevin Oats - Tech Store Clerk */ <<run $npcs.push(setup.createNPC({ name: "Kevin Oats", jobs: "Tech Store Clerk", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 20, dexterity: 22, strength: 15, intelligence: 35}, physicalTraits: ["Lean", "Youthful"], mentalTraits: ["Intelligent", "Analytical", "Shy", "Awkward", "Insecure", "Nerd"], skills: ["Coding", "Sales", "Math Skills", "Gaming", "Building PCs"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Destiny Pumpkin - Adult Store Clerk */ <<run $npcs.push(setup.createNPC({ name: "Destiny Pumpkin", jobs: "Adult Store Clerk", gender: "female", chest: "huge", butt: "large", genitals: "vagina", baseStats: {charisma: 30, dexterity: 22, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Pierced", "Voluptuous", "Tattooed"], mentalTraits: ["Confident", "Sly", "Creative", "Selfish", "Manipulative"], skills: ["Sales", "Persuasion", "Sexually Skilled", "Art", "Writing"], skinTone: "tan", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Alex Passionfruit - Adult Store Clerk */ <<run $npcs.push(setup.createNPC({ name: "Alex Passionfruit", jobs: "Adult Store Clerk", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 28, dexterity: 22, strength: 18, intelligence: 20}, physicalTraits: ["Attractive", "Lean", "Pierced"], mentalTraits: ["Outgoing", "Witty", "Curious", "Flirty", "Femboy"], skills: ["Sales", "Persuasion", "Sexually Skilled", "Music", "Gaming"], skinTone: "pale", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Hannah Chuckins - Baker */ <<run $npcs.push(setup.createNPC({ name: "Hannah Chuckins", jobs: "Baker", gender: "female", chest: "medium", butt: "large", genitals: "tight vagina", baseStats: {charisma: 20, dexterity: 25, strength: 18, intelligence: 20}, physicalTraits: ["Soft", "Curvy", "Freckled"], mentalTraits: ["Kind", "Patient", "Creative", "Shy", "Nurturing"], skills: ["Baking", "Cooking", "Gardening", "Painting", "Singing"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Fen Ris - Fitness Trainer */ <<run $npcs.push(setup.createNPC({ name: "Fen Ris", jobs: "Fitness Trainer", gender: "female", chest: "huge", butt: "medium", genitals: "vagina", baseStats: {charisma: 45, dexterity: 80, strength: 80, intelligence: 25}, physicalTraits: ["Tall", "Muscular", "Athletic Build", "Sharp Features", "Were-Creature"], mentalTraits: ["Confident", "Calm", "Honest", "Patient", "Disciplined"], skills: ["Athletics", "Heavy Lifting", "Combat", "Yoga", "Teaching"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Pheiffer Coms - Police Officer */ <<run $npcs.push(setup.createNPC({ name: "Pheiffer Coms", jobs: "Police Officer", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 30, dexterity: 28, strength: 50, intelligence: 25}, physicalTraits: ["Fit", "Strong", "Athletic Build", "Broad-shouldered"], mentalTraits: ["Brave", "Honest", "Stubborn", "Loyal", "By-the-Book"], skills: ["Combat", "Driving", "First Aid", "Athletics", "Fishing"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Selkira Onyxia - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Selkira Onyxia", jobs: "Brothel Worker", gender: "female", chest: "giant", butt: "giant", genitals: "loose vagina", baseStats: {charisma: 42, dexterity: 30, strength: 18, intelligence: 20}, physicalTraits: ["Curvy", "Attractive", "Fit", "Graceful", "Flexible", "Silky Voice", "Seductive", "Broad-shouldered"], mentalTraits: ["Alluring", "Cold", "Overthinker", "Impulsive", "Insecure", "Ambitious", "Dominant", "Jealous"], skills: ["High Heels Proficient", "Sexually Skilled", "Serving", "Acting", "Languages"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Janis Besser - Baker */ <<run $npcs.push(setup.createNPC({ name: "Janis Besser", jobs: "Baker", gender: "female", chest: "small", butt: "small", genitals: "tight vagina", baseStats: {charisma: 18, dexterity: 28, strength: 15, intelligence: 22}, physicalTraits: ["Petite", "Soft", "Freckled", "Youthful", "Quick", "Warm Tone"], mentalTraits: ["Kind", "Patient", "Creative", "Hardworking", "Shy", "Nurturing"], skills: ["Baking", "Cooking", "Gardening", "Customer Service", "Painting"], skinTone: "pale", hairColor: "Red", hairLength: "short", age: "Adult" }))>> /* Dennis Fungi - Dancing Instructor */ <<run $npcs.push(setup.createNPC({ name: "Dennis Fungi", jobs: "Dancing Instructor", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 50, dexterity: 55, strength: 48, intelligence: 25}, physicalTraits: ["Fit", "Athletic Build", "Graceful", "Flexible", "Attractive", "Smooth Voice"], mentalTraits: ["Confident", "Outgoing", "Creative", "Energetic", "Disciplined", "Charming"], skills: ["Dancing", "Teaching", "Athletics", "Music", "Yoga"], skinTone: "tan", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Yvela Mushroom - Dancing Instructor */ <<run $npcs.push(setup.createNPC({ name: "Yvela Mushroom", jobs: "Dancing Instructor", gender: "female", chest: "huge", butt: "huge", genitals: "vagina", baseStats: {charisma: 52, dexterity: 58, strength: 50, intelligence: 28}, physicalTraits: ["Fit", "Athletic Build", "Graceful", "Flexible", "Attractive", "Melodic Voice"], mentalTraits: ["Confident", "Ambitious", "Creative", "Energetic", "Disciplined", "Competitive"], skills: ["Dancing", "Teaching", "Athletics", "Yoga", "Martial Arts"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Banana Banana - Barista */ <<run $npcs.push(setup.createNPC({ name: "Banana Banana", jobs: "Barista", gender: "female", chest: "giant", butt: "giant", genitals: "tight vagina", baseStats: {charisma: 22, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Youthful", "Quick", "Energetic", "Friendly Tone", "Fashionable"], mentalTraits: ["Friendly", "Optimistic", "Energetic", "Creative", "Talkative", "Bubbly"], skills: ["Customer Service", "Cooking", "Art", "Social Media", "Music"], skinTone: "tan", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Xenis Aku - Bus Driver */ <<run $npcs.push(setup.createNPC({ name: "Xenis Aku", jobs: "Bus Driver", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 18, dexterity: 25, strength: 22, intelligence: 20}, physicalTraits: ["Sturdy", "Calm Voice", "Mature", "Relaxed"], mentalTraits: ["Calm", "Patient", "Honest", "Reliable", "Introverted", "Thoughtful"], skills: ["Driving", "Customer Service", "First Aid", "Navigation", "Mechanical Repair"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult" }))>> /* Zanithar Galdenentri - Unemployed */ <<run $npcs.push(setup.createNPC({ name: "Zanithar Galdenentri", jobs: "Unemployed", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 15, dexterity: 15, strength: 12, intelligence: 35}, physicalTraits: ["Mature", "Underweight", "Mumbly Voice", "Freckled", "Scarred"], mentalTraits: ["Crazy", "Eccentric", "Intelligent", "Paranoid", "Erratic", "Obsessive", "Bookworm"], skills: ["Magic Theory", "Languages", "Writing", "Teaching", "Medicine"], skinTone: "pale", hairColor: "Platinum Blonde", hairLength: "long", age: "Mature Adult" }))>> /* Trixie Rye - Cocktail Waitress */ <<run $npcs.push(setup.createNPC({ name: "Trixie Rye", jobs: "Cocktail Waitress", gender: "female", chest: "huge", butt: "huge", genitals: "vagina", baseStats: {charisma: 42, dexterity: 30, strength: 18, intelligence: 20}, physicalTraits: ["Attractive", "Voluptuous", "Graceful", "Smooth Skin", "Charming Tone"], mentalTraits: ["Confident", "Flirty", "Witty", "Ambitious", "Sly", "Outgoing"], skills: ["Serving", "High Heels Proficient", "Customer Service", "Dancing", "Persuasion"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Revna McKraken - Strange book shop owner */ /* Custom Information: A hypnotic and cunning woman who pulls you in so naturally you don't even notice her pointy teeth. Her words and methods are strange and she seems quite cagey about her past and personal life. You get the feeling she won't trade you anything of herself, but she might appreciate a donation. (Just a reminder about the "totally not a vampire" trait. Since the desires section doesn't work, here is the working list. Traits she wants for her vanity: Alluring, witty, high heel proficient, modeling, dancing, smooth skin, sharp features, soft, flexible, fashionable: Traits she wants for her efficiency: efficient, quick learner, shrewd, management, athletics, tech savvy, coding; She should never trade away anything! She's a vampire, she takes and extracts by nature.) */ <<run $npcs.push(setup.createNPC({ name: "Revna McKraken", jobs: "Mysterious Book Shop owner", gender: "female", chest: "giant", butt: "giant", genitals: "vagina", baseStats: {charisma: 99, dexterity: 99, strength: 99, intelligence: 99}, physicalTraits: ["Pale Skin", "Attractive", "Graceful", "Voluptuous", "Quick Reflexes", "Definitely not a Vampire"], mentalTraits: ["Charming", "Diplomatic", "Bookworm", "Seductive", "Intelligent", "Moody", "Sly", "Confident", "Creative", "Patient", "Perceptive", "Deceitful", "Goth"], voiceTraits: ["Silky Voice"], skills: ["Sexually Skilled", "Stealth", "Persuasion", "Acting", "Languages", "Product Knowledge", "Martial Arts", "Gardening", "Writing", "Medicine", "Combat", "Occult Expert"], skinTone: "pale", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Butt Johnson - Streamer (Apartment Neighbor) */ <<run $npcs.push(setup.createNPC({ name: "Butt Johnson", jobs: "Streamer", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 18, dexterity: 15, strength: 12, intelligence: 35}, physicalTraits: ["Short Hair", "Overweight", "Plain", "Blemished", "Unkempt"], mentalTraits: ["Nerd", "Lazy", "Introverted", "Awkward", "Disorganized", "Shy", "Forgetful", "Obsessive"], skills: ["Gaming", "Coding", "Tech-Savvy", "Social Media", "Forklift Certified"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Purple Wood - Streamer */ <<set _violetTemp = setup.createNPC({ name: "Purple Wood", jobs: "Streamer", gender: "female", chest: "small", butt: "huge", genitals: "vagina", baseStats: {charisma: 25, dexterity: 20, strength: 15, intelligence: 30}, physicalTraits: ["Attractive", "Pierced", "Tattooed", "Graceful", "Pale Skin"], mentalTraits: ["Creative", "Introverted", "Moody", "Goth", "Cynical"], skills: ["Sales", "Art", "Music", "Painting", "Writing"], skinTone: "pale", hairColor: "Black", hairLength: "long", age: "Adult" })>> /* Luna Snow - Amateur Musician */ <<run $npcs.push(setup.createNPC({ name: "Luna Snow", jobs: "Amateur Musician", gender: "female", chest: "huge", butt: "huge", genitals: "big penis", baseStats: {charisma: 99, dexterity: 10, strength: 10, intelligence: 10}, physicalTraits: ["Curvy", "Soft", "Smooth Skin", "Youthful", "Attractive", "Fit", "Graceful", "Freckled", "Short"], mentalTraits: ["Charming", "Funny", "Lucky", "Bookworm", "Warm", "Blunt", "Creative", "Wise", "Intelligent", "Stubborn", "Calm", "Artistic", "Musky"], skills: ["Guitar", "Photography", "Art", "Painting", "Music", "Acting", "Martial Arts"], skinTone: "pale", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> <<run $npcs.push(_violetTemp)>> /* Activate Bimbo state on Violet at game start */ <<run setup.activateBimboTrait(_violetTemp)>> /* Initialize permanent IDs for trading system */ <<for _npc range $npcs>> <<if !_npc.permanentId>> <<set _npc.permanentId = _npc.name>> <</if>> <</for>> <</silently>>
<<nobr>> <!-- Track the original location if not already in NPC flow --> <<if !$lastLocation || !["NPCInteraction", "NPCTalk", "NPCTalkResponse", "TradeInterface", "TradeSelectItems", "TradeResult"].includes($lastLocation)>> <<set $preNPCLocation = $lastLocation>> <</if>> <<set _npc = $tradingWithNPC>> <<if !_npc>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: NPC not found.</p> <<if $lastLocation>> [[Go Back|$lastLocation]] <<else>> [[Go Back|Mall]] <</if>> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">_npc.name</h1> <p style="color: white; margin: 0; font-size: 18px; text-align: center;"> <<if _npc.jobs && _npc.jobs.length > 0>> <<print _npc.jobs.join(", ")>> <<else>> Unemployed <</if>> </p> </div> <!-- NPC Stats --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #17a2b8; padding-bottom: 10px;">📊 Stats</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; font-size: 16px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Charisma:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.charisma</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Dexterity:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.dexterity</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Strength:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.strength</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Intelligence:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.intelligence</span> </div> </div> </div> <!-- NPC Appearance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">👤 Appearance</h3> <div style="display: flex; gap: 20px; align-items: flex-start;"> <!-- Appearance Details --> <div style="flex: 1; font-size: 16px; color: #ccc; line-height: 1.8;"> <<set _npcHairStyle = _npc.appearance.hairStyle === "messy" ? "Messy " : "">> <<set _npcHairLength = _npc.appearance.hairLength ? _npc.appearance.hairLength.toUpperFirst() : "Short">> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Hair:</strong> <<print _npcHairStyle + _npcHairLength>> <<print _npc.appearance.hairColor>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Skin Tone:</strong> <<print _npc.appearance.skinTone.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Physique:</strong> <<print _npc.appearance.physique.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Chest:</strong> <<print _npc.bodyParts.chest.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Butt:</strong> <<print _npc.bodyParts.butt.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Genitals:</strong> <<print (_npc.bodyParts.genitals || "Unknown").toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Gender:</strong> <<print _npc.bodyParts.gender.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Age:</strong> <<print _npc.appearance.age || "Adult">></p> </div> <!-- NPC Image --> <<if $imageSettings.imagesEnabled && $imageSettings.npcImagesEnabled>> <<set _npcImage = setup.getNPCImage(_npc.name)>> <<if _npcImage>> <div style="flex-shrink: 0;"> <img @src="_npcImage" style="max-width: 250px; max-height: 350px; border-radius: 8px; border: 2px solid #9b59b6; box-shadow: 0 0 15px rgba(155,89,182,0.4);" onerror="this.style.display='none';"> </div> <</if>> <</if>> </div> </div> <!-- NPC Traits --> <<if _npc.physicalTraits && _npc.physicalTraits.length > 0>> <<set _displayNPCPhysicalTraits = _npc.physicalTraits.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair"; })>> <<if _displayNPCPhysicalTraits.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h3> <div style="line-height: 2.5;"> <<for _trait range _displayNPCPhysicalTraits>> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500; white-space: nowrap; display: inline-block; margin: 5px 5px 5px 0;">_trait</span> <</for>> </div> </div> <</if>> <</if>> <<if _npc.mentalTraits && _npc.mentalTraits.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h3> <div style="line-height: 2.5;"> <<for _trait range _npc.mentalTraits>> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500; white-space: nowrap; display: inline-block; margin: 5px 5px 5px 0;">_trait</span> <</for>> </div> </div> <</if>> <<if _npc.skills && _npc.skills.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h3> <div style="line-height: 2.5;"> <<for _skill range _npc.skills>> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500; white-space: nowrap; display: inline-block; margin: 5px 5px 5px 0;">_skill</span> <</for>> </div> </div> <</if>> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 25px;"> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💱 Initiate Trade</div>">> <<set $tradingWithNPC = _npc>> <<goto "TradeInterface">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💬 Talk</div>">> <<goto "NPCTalk">> <</link>> </div> <br> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave</div>">> <<set $tradingWithNPC = null>> <<goto $preNPCLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<if !$tradingWithNPC>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: No NPC selected for trading.</p> [[Go Back|$lastLocation]] </div> <<else>> <<set _npc = $tradingWithNPC>> <!-- Initialize trade packages if not exists --> <<if !$playerTradePackage>> <<set $playerTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [] }>> <</if>> <<if !$npcTradePackage>> <<set $npcTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [] }>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">💱 Trading with <<print _npc.name>></h1> <p style="color: white; margin: 0; font-size: 16px; text-align: center;"> Build your trade packages below, then attempt the swap when ready </p> </div> <!-- Trade Limit Display --> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="color: #ffc107; font-size: 18px; font-weight: bold;"> ⚡ Trades Remaining Today: <span style="color: #667eea;"><<print $tradesRemainingToday>> / 5</span> </div> <<if $failedTradesWithToday.includes(_npc.name)>> <div style="color: #ff6b6b; font-weight: bold; margin-top: 10px; font-size: 16px;"> ⚠️ You already failed a trade with <<print _npc.name>> today! </div> <</if>> </div> <!-- Trade Value Calculation --> <<set _playerValue = setup.calculateTradeValue($playerTradePackage, true)>> <<set _baseNpcValue = setup.calculateTradeValue($npcTradePackage, false)>> <!-- Calculate preference adjustments FIRST (before relationship) --> <<set _npcValueAfterPreferences = setup.calculatePreferenceValueAdjustment(_npc, $playerTradePackage, $npcTradePackage, _baseNpcValue)>> <<set _preferenceAdjustment = _npcValueAfterPreferences - _baseNpcValue>> <!-- Get relationship level --> <<set _relLevel = 0>> <<if $relationships[_npc.name]>> <<set _relLevel = $relationships[_npc.name].level>> <</if>> <!-- Calculate relationship discount multiplier --> <<set _relMultiplier = 1.0>> <<if _relLevel === 2>> <<set _relMultiplier = 0.95>> <<elseif _relLevel === 3>> <<set _relMultiplier = 0.90>> <<elseif _relLevel === 4>> <<set _relMultiplier = 0.85>> <<elseif _relLevel >= 5>> <<set _relMultiplier = 0.80>> <</if>> <!-- Apply relationship discount to get FINAL adjusted value --> <<set _adjustedNpcValue = Math.floor(_npcValueAfterPreferences * _relMultiplier)>> <<set _relationshipDiscount = _npcValueAfterPreferences - _adjustedNpcValue>> <!-- Calculate success chance modifiers --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _charismaBonus = 0>> <<if _totalCharisma > 0>> <<set _logValue = Math.log(_totalCharisma + 1) / Math.log(101)>> <<set _charismaBonus = Math.floor(8.67 * _logValue)>> <<if _totalCharisma > 100>> <<set _highBonus = ((_totalCharisma - 100) / 899) * (20 - 8)>> <<set _charismaBonus = Math.floor(8 + _highBonus)>> <</if>> <<set _charismaBonus = Math.max(0, Math.min(20, _charismaBonus))>> <</if>> <<set _tradingBonus = $skills.includes("Trading") ? 2 : 0>> <<set _persuasionBonus = $skills.includes("Persuasion") ? 3 : 0>> <<set _bitchyPenalty = $mentalTraits.includes("Bitchy") ? -5 : 0>> <<set _relationshipBonus = setup.getRelationshipTradeBonus(_npc.name)>> <<set _totalModifier = _charismaBonus + _tradingBonus + _persuasionBonus + _bitchyPenalty + _relationshipBonus>> <<set _tradeChance = setup.calculateTradeChance(_playerValue, _adjustedNpcValue, _npc, $playerTradePackage, $npcTradePackage)>> <!-- Success Chance Modifiers Display --> <<if _totalModifier !== 0>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid ' + (_totalModifier > 0 ? '#51cf66' : '#ff6b6b') + ';'"> <div style="color: #aaa; font-size: 14px; margin-bottom: 8px; font-weight: bold;">Success Chance Modifiers:</div> <<if _charismaBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Charisma Bonus: +<<print _charismaBonus>>% (Charisma: <<print _totalCharisma>>) </div> <</if>> <<if _tradingBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Trading Skill: +<<print _tradingBonus>>% </div> <</if>> <<if _persuasionBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Persuasion Skill: +<<print _persuasionBonus>>% </div> <</if>> <<if _relationshipBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Relationship Bonus: +<<print _relationshipBonus>>% (Level <<print _relLevel>>) </div> <</if>> <<if _bitchyPenalty < 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0;"> ✗ Bitchy Trait: <<print _bitchyPenalty>>% </div> <</if>> <div @style="'color: ' + (_totalModifier > 0 ? '#51cf66' : '#ff6b6b') + '; font-size: 15px; margin-top: 8px; font-weight: bold; border-top: 1px solid #444; padding-top: 8px;'"> Total Modifier: <<if _totalModifier > 0>>+<</if>><<print _totalModifier>>% </div> </div> <</if>> <!-- Value Adjustment Breakdown --> <<if _preferenceAdjustment !== 0 || _relationshipDiscount > 0>> <<set _prefs = setup.getNPCPreferences(_npc)>> <<set _willingCount = 0>> <<set _desiredCount = 0>> <<set _reluctantCount = 0>> <<if _prefs && _prefs.willingToTrade>> <<for _i = 0; _i < $playerTradePackage.physical.length; _i++>> <<if _prefs.willingToTrade.physical && _prefs.willingToTrade.physical.includes($playerTradePackage.physical[_i])>> <<set _willingCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.mental.length; _i++>> <<if _prefs.willingToTrade.mental && _prefs.willingToTrade.mental.includes($playerTradePackage.mental[_i])>> <<set _willingCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.skills.length; _i++>> <<if _prefs.willingToTrade.skills && _prefs.willingToTrade.skills.includes($playerTradePackage.skills[_i])>> <<set _willingCount++>> <</if>> <</for>> <</if>> <<if _prefs && _prefs.desires>> <<for _i = 0; _i < $playerTradePackage.physical.length; _i++>> <<if _prefs.desires.physical && _prefs.desires.physical.includes($playerTradePackage.physical[_i])>> <<set _desiredCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.mental.length; _i++>> <<if _prefs.desires.mental && _prefs.desires.mental.includes($playerTradePackage.mental[_i])>> <<set _desiredCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.skills.length; _i++>> <<if _prefs.desires.skills && _prefs.desires.skills.includes($playerTradePackage.skills[_i])>> <<set _desiredCount++>> <</if>> <</for>> <</if>> <<if _prefs && _prefs.reluctantToTrade>> <<for _i = 0; _i < $npcTradePackage.physical.length; _i++>> <<if _prefs.reluctantToTrade.physical && _prefs.reluctantToTrade.physical.includes($npcTradePackage.physical[_i])>> <<set _reluctantCount++>> <</if>> <</for>> <<for _i = 0; _i < $npcTradePackage.mental.length; _i++>> <<if _prefs.reluctantToTrade.mental && _prefs.reluctantToTrade.mental.includes($npcTradePackage.mental[_i])>> <<set _reluctantCount++>> <</if>> <</for>> <<for _i = 0; _i < $npcTradePackage.skills.length; _i++>> <<if _prefs.reluctantToTrade.skills && _prefs.reluctantToTrade.skills.includes($npcTradePackage.skills[_i])>> <<set _reluctantCount++>> <</if>> <</for>> <</if>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid ' + ((_preferenceAdjustment > 0 || _relationshipDiscount > 0) ? '#51cf66' : '#ff6b6b') + ';'"> <div style="color: #aaa; font-size: 14px; margin-bottom: 8px; font-weight: bold;">NPC Value Adjustments:</div> <div style="color: #ccc; font-size: 14px; margin: 3px 0;"> Base NPC Offer Value: <<print _baseNpcValue>> </div> <<if _willingCount > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Willing Items: <<print _willingCount>> item<<if _willingCount > 1>>s<</if>> (-20% cost each) </div> <</if>> <<if _desiredCount > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> 💚 Desired Items: <<print _desiredCount>> item<<if _desiredCount > 1>>s<</if>> (-15% cost each) </div> <</if>> <<if _reluctantCount > 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0;"> ⚠️ Reluctant Items: <<print _reluctantCount>> item<<if _reluctantCount > 1>>s<</if>> (+30% cost each) </div> <</if>> <<if _preferenceAdjustment !== 0>> <<if _preferenceAdjustment > 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0; font-style: italic;"> Preference Penalty: +<<print Math.abs(_preferenceAdjustment)>> </div> <<else>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0; font-style: italic;"> Preference Discount: <<print _preferenceAdjustment>> </div> <</if>> <div style="color: #ccc; font-size: 14px; margin: 3px 0; border-top: 1px solid #444; padding-top: 5px; margin-top: 5px;"> After Preferences: <<print _npcValueAfterPreferences>> </div> <</if>> <<if _relationshipDiscount > 0>> <<set _discountPercent = Math.round((1 - _relMultiplier) * 100)>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0; margin-top: 5px;"> ✓ Relationship Discount (Level <<print _relLevel>>): -<<print _discountPercent>>% (-<<print _relationshipDiscount>>) </div> <</if>> <div @style="'color: ' + (_adjustedNpcValue < _baseNpcValue ? '#51cf66' : '#ff6b6b') + '; font-size: 15px; margin-top: 8px; font-weight: bold; border-top: 1px solid #444; padding-top: 8px;'"> Final NPC Value Required: <<print _adjustedNpcValue>> </div> </div> <</if>> <!-- Value from Exceeding Requirement --> <<if _playerValue > _adjustedNpcValue>> <<set _excessValue = _playerValue - _adjustedNpcValue>> <<set _excessPercent = Math.round((_excessValue / _adjustedNpcValue) * 100)>> <<set _baseChanceFromValue = Math.min(100, 1 + Math.round(((_playerValue / _adjustedNpcValue) - 1.0) / 0.7 * 99))>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"> <div style="color: #aaa; font-size: 14px; margin-bottom: 8px; font-weight: bold;">Trade Value Bonus:</div> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Offering <<print _excessValue>> more than required (+<<print _excessPercent>>% extra) </div> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Base success chance from value: <<print _baseChanceFromValue>>% </div> </div> <</if>> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; border: 3px solid #667eea; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.3);"> <div style="font-size: 16px; color: #aaa; margin-bottom: 8px; font-weight: bold;">Your Offer Value</div> <div style="font-size: 36px; font-weight: bold; color: #667eea;"><<print _playerValue>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; border: 3px solid #9b59b6; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.3);"> <div style="font-size: 16px; color: #aaa; margin-bottom: 8px; font-weight: bold;">Their Offer Value</div> <div style="font-size: 36px; font-weight: bold; color: #9b59b6;"><<print _baseNpcValue>></div> </div> <div @style="'background: #1a1a1a; padding: 20px; border-radius: 10px; border: 3px solid ' + (_tradeChance >= 50 ? '#51cf66' : (_tradeChance >= 30 ? '#ffc107' : '#ff6b6b')) + '; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'"> <div style="font-size: 16px; color: #aaa; margin-bottom: 8px; font-weight: bold;">Success Chance</div> <div @style="'font-size: 36px; font-weight: bold; color: ' + (_tradeChance >= 50 ? '#51cf66' : (_tradeChance >= 30 ? '#ffc107' : '#ff6b6b')) + ';'"><<print _tradeChance>>%</div> </div> </div> <<if _playerValue < _adjustedNpcValue>> <div style="background: #1a1a1a; border: 3px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #ff6b6b;">⚠️ Insufficient Value!</strong> You need to offer at least <strong><<print _adjustedNpcValue>></strong> value to attempt this trade. <<if _relationshipDiscount > 0>><span style="color: #51cf66;">(Relationship discount applied! Originally <<print _npcValueAfterPreferences>>)</span><</if>> You are offering <strong><<print _playerValue>></strong>. </div> <<elseif _tradeChance === 0>> <div style="background: #1a1a1a; border: 3px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #ff6b6b;">⚠️ Cannot Trade!</strong> Your offer does not meet the minimum requirements. </div> <<elseif _tradeChance < 30>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #ffc107;">⚠️ Low Chance!</strong> Consider offering more value for a better chance of success. (Currently <<print _tradeChance>>%) </div> <<elseif _tradeChance >= 100>> <div style="background: #1a1a1a; border: 3px solid #51cf66; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #51cf66;">✓ Guaranteed Success!</strong> You are offering double value or more. This trade will succeed 100%. </div> <<else>> <div style="background: #1a1a1a; border: 3px solid #17a2b8; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #17a2b8;">ℹ️ Fair Trade.</strong> You have a <<print _tradeChance>>% chance of success. Offer more value to increase your odds. </div> <</if>> <!-- Two Column Layout for Trade Building --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 25px; margin-bottom: 25px;"> <!-- YOUR OFFER COLUMN --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 4px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 20px 0; font-size: 26px; border-bottom: 3px solid #667eea; padding-bottom: 10px;">🎁 Your Offer</h2> <<if $playerTradePackage.name.length === 0 && $playerTradePackage.stats.length === 0 && $playerTradePackage.physical.length === 0 && $playerTradePackage.mental.length === 0 && $playerTradePackage.skills.length === 0 && $playerTradePackage.bodyParts.length === 0 && !$playerTradePackage.job>> <p style="color: #666; font-style: italic; text-align: center; font-size: 16px; padding: 40px 20px;">Empty. Click below to add items</p> <<else>> <!-- NAME --> <<if $playerTradePackage.name.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">👤 Name</div> <<for _i = 0; _i < $playerTradePackage.name.length; _i++>> <<set _nameObj = $playerTradePackage.name[_i]>> <<set _displayName = _nameObj.type === "firstName" ? $firstName : $lastName>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<if _nameObj.type === "firstName">>First Name<<else>>Last Name<</if>>: <<print _displayName>> <<capture _nameObj>> <<link "❌">> <<run $playerTradePackage.name.delete(_nameObj)>> <<set _matchingNpc = $npcTradePackage.name.find(n => n.type === _nameObj.type)>> <<if _matchingNpc>><<run $npcTradePackage.name.delete(_matchingNpc)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- BODY PARTS --> <<if $playerTradePackage.bodyParts.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ff6b6b;"> <div style="color: #ff6b6b; font-weight: bold; margin-bottom: 8px;">🫀 Body Parts</div> <<for _i = 0; _i < $playerTradePackage.bodyParts.length; _i++>> <<set _bp = $playerTradePackage.bodyParts[_i]>> <<capture _bp>> <<set _bpActualValue = _bp.name === "chest" || _bp.name === "butt" || _bp.name === "gender" || _bp.name === "genitals" ? $bodyParts[_bp.name] : $appearance[_bp.name]>> <<if _bpActualValue && _bpActualValue !== "">> <<set _bpValue = setup.getTraitValue("bodyPart", _bp.name, _bpActualValue)>> <<else>> <<set _bpValue = 0>> <</if>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _bp.name.toUpperFirst()>> (<<print _bpValue>>) <<link "❌">> <<run $playerTradePackage.bodyParts.delete(_bp)>> <<set _matchingNpcBp = $npcTradePackage.bodyParts.find(b => b.name === _bp.name)>> <<if _matchingNpcBp>><<run $npcTradePackage.bodyParts.delete(_matchingNpcBp)>><</if>> <<goto "TradeInterface">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- PHYSICAL TRAITS --> <<if $playerTradePackage.physical.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #51cf66;"> <div style="color: #51cf66; font-weight: bold; margin-bottom: 8px;">💪 Physical Traits</div> <<for _i = 0; _i < $playerTradePackage.physical.length; _i++>> <<set _trait = $playerTradePackage.physical[_i]>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<link "❌">> <<run $playerTradePackage.physical.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, _npc.physicalTraits)>> <<if _conflict>><<run $npcTradePackage.physical.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- MENTAL TRAITS --> <<if $playerTradePackage.mental.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">🧠 Mental Traits</div> <<for _i = 0; _i < $playerTradePackage.mental.length; _i++>> <<set _trait = $playerTradePackage.mental[_i]>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<capture _trait>> <<link "❌">> <<run $playerTradePackage.mental.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, _npc.mentalTraits)>> <<if _conflict>><<run $npcTradePackage.mental.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- SKILLS --> <<if $playerTradePackage.skills.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ffc107;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 8px;">🎯 Skills</div> <<for _i = 0; _i < $playerTradePackage.skills.length; _i++>> <<set _skill = $playerTradePackage.skills[_i]>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _skill>> (+<<print _skillValue>>) <<capture _skill>> <<link "❌">> <<run $playerTradePackage.skills.delete(_skill)>> <<run $npcTradePackage.skills.delete(_skill)>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- JOB --> <<if $playerTradePackage.job>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #17a2b8;"> <div style="color: #17a2b8; font-weight: bold; margin-bottom: 8px;">💼 Job</div> <<set _jobValue = setup.getTraitValue("job", $playerTradePackage.job)>> <div style="color: #ccc; padding: 6px 0;"> <<print $playerTradePackage.job>> (<<print _jobValue>>) <<link "❌">> <<set $playerTradePackage.job = null>> <<set $npcTradePackage.job = null>> <<goto "TradeInterface">> <</link>> </div> </div> <</if>> <</if>> <<link "<div style='background: #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; margin-top: 15px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>➕ Add to Your Offer</div>">> <<set $tradeSide = "player">> <<goto "TradeSelectItems">> <</link>> </div> <!-- THEIR OFFER COLUMN --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 4px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 20px 0; font-size: 26px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">🎁 Their Offer</h2> <<if $npcTradePackage.name.length === 0 && $npcTradePackage.stats.length === 0 && $npcTradePackage.physical.length === 0 && $npcTradePackage.mental.length === 0 && $npcTradePackage.skills.length === 0 && $npcTradePackage.bodyParts.length === 0 && !$npcTradePackage.job>> <p style="color: #666; font-style: italic; text-align: center; font-size: 16px; padding: 40px 20px;">Empty. Click below to add items</p> <<else>> <!-- NAME --> <<if $npcTradePackage.name.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">👤 Name</div> <<for _i = 0; _i < $npcTradePackage.name.length; _i++>> <<set _nameObj = $npcTradePackage.name[_i]>> <<set _npcNameParts = _npc.name.split(" ")>> <<set _displayName = _nameObj.type === "firstName" ? _npcNameParts[0] : _npcNameParts.slice(1).join(" ")>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<if _nameObj.type === "firstName">>First Name<<else>>Last Name<</if>>: <<print _displayName>> <<capture _nameObj>> <<link "❌">> <<run $npcTradePackage.name.delete(_nameObj)>> <<set _matchingPlayer = $playerTradePackage.name.find(n => n.type === _nameObj.type)>> <<if _matchingPlayer>><<run $playerTradePackage.name.delete(_matchingPlayer)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- BODY PARTS --> <<if $npcTradePackage.bodyParts.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ff6b6b;"> <div style="color: #ff6b6b; font-weight: bold; margin-bottom: 8px;">🫀 Body Parts</div> <<for _i = 0; _i < $npcTradePackage.bodyParts.length; _i++>> <<set _bp = $npcTradePackage.bodyParts[_i]>> <<capture _bp>> <<set _bpActualValue = _bp.name === "chest" || _bp.name === "butt" || _bp.name === "gender" || _bp.name === "genitals" ? _npc.bodyParts[_bp.name] : _npc.appearance[_bp.name]>> <<if _bpActualValue && _bpActualValue !== "">> <<set _bpValue = setup.getTraitValue("bodyPart", _bp.name, _bpActualValue)>> <<else>> <<set _bpValue = 0>> <</if>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _bp.name.toUpperFirst()>> (<<print _bpValue>>) <<link "❌">> <<run $npcTradePackage.bodyParts.delete(_bp)>> <<set _matchingPlayerBp = $playerTradePackage.bodyParts.find(b => b.name === _bp.name)>> <<if _matchingPlayerBp>><<run $playerTradePackage.bodyParts.delete(_matchingPlayerBp)>><</if>> <<goto "TradeInterface">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- PHYSICAL TRAITS --> <<if $npcTradePackage.physical.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #51cf66;"> <div style="color: #51cf66; font-weight: bold; margin-bottom: 8px;">💪 Physical Traits</div> <<for _i = 0; _i < $npcTradePackage.physical.length; _i++>> <<set _trait = $npcTradePackage.physical[_i]>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<capture _trait>> <<link "❌">> <<run $npcTradePackage.physical.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $physicalTraits)>> <<if _conflict>><<run $playerTradePackage.physical.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- MENTAL TRAITS --> <<if $npcTradePackage.mental.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">🧠 Mental Traits</div> <<for _i = 0; _i < $npcTradePackage.mental.length; _i++>> <<set _trait = $npcTradePackage.mental[_i]>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<capture _trait>> <<link "❌">> <<run $npcTradePackage.mental.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $mentalTraits)>> <<if _conflict>><<run $playerTradePackage.mental.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- SKILLS --> <<if $npcTradePackage.skills.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ffc107;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 8px;">🎯 Skills</div> <<for _i = 0; _i < $npcTradePackage.skills.length; _i++>> <<set _skill = $npcTradePackage.skills[_i]>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _skill>> (+<<print _skillValue>>) <<capture _skill>> <<link "❌">> <<run $npcTradePackage.skills.delete(_skill)>> <<run $playerTradePackage.skills.delete(_skill)>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- JOB --> <<if $npcTradePackage.job>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #17a2b8;"> <div style="color: #17a2b8; font-weight: bold; margin-bottom: 8px;">💼 Job</div> <<set _jobValue = setup.getTraitValue("job", $npcTradePackage.job)>> <div style="color: #ccc; padding: 6px 0;"> <<print $npcTradePackage.job>> (<<print _jobValue>>) <<link "❌">> <<set $npcTradePackage.job = null>> <<set $playerTradePackage.job = null>> <<goto "TradeInterface">> <</link>> </div> </div> <</if>> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; margin-top: 15px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>➕ Request Their Items</div>">> <<set $tradeSide = "npc">> <<goto "TradeSelectItems">> <</link>> </div> </div> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-top: 25px;"> <<if _playerValue >= _adjustedNpcValue && _tradeChance > 0 && !$failedTradesWithToday.includes(_npc.name) && $tradesRemainingToday > 0>> <<link `"<div style='background: #51cf66; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>✅ Attempt Trade (" + _tradeChance + "%)</div>"`>> <<set $tradeResult = setup.attemptTrade(_npc, $playerTradePackage, $npcTradePackage)>> <<goto "TradeResult">> <</link>> <<else>> <div style='background: #3a3a3a; color: #666; padding: 18px; border-radius: 12px; text-align: center; font-weight: bold; font-size: 18px; opacity: 0.6;'>✅ Cannot Trade</div> <</if>> <<link "<div style='background: #ff6b6b; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🗑️ Clear All</div>">> <<set $playerTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [] }>> <<set $npcTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [] }>> <<goto "TradeInterface">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Cancel</div>">> <<set $playerTradePackage = null>> <<set $npcTradePackage = null>> <<set $currentNPC = null>> <<set $tradingWithNPC = null>> <<goto $lastLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Age Verification Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; text-align: center;">⚠️ Age Verification</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 16px; margin: 0 0 20px 0; text-align: center;"> Are you 18 years old or older? </p> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #51cf66dd 100%); color: white; padding: 12px 35px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); display: inline-block;'>✅ Yes</div>">> <<goto "CharacterCreation">> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #ff6b6bdd 100%); color: white; padding: 12px 35px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); display: inline-block;'>❌ No</div>">> <<goto "Exit">> <</link>> </div> </div> </div> <!-- Game Info Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 16px; margin: 0 0 10px 0; text-align: center;"> Welcome to Sunfish City! A trait swapping game I made for the fun of it! </p> <p style="color: #ffc107; font-size: 14px; margin: 0; text-align: center; font-style: italic;"> <strong>Disclaimer:</strong> Not all jobs have functionality yet. </p> </div> <!-- Bugs Report Box --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #51cf66; font-size: 15px; margin: 0; text-align: center; font-weight: bold;"> Please report any bugs you find! </p> </div> <!-- Side Note Box --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #4dabf7; font-size: 15px; margin: 0; text-align: center; font-weight: bold;"> Side note, I'm looking for help with genning images for the player and NPCs, so check out my <a href="https://discord.gg/z9eDdQC6zA" target="_blank" style="color: #4dabf7; text-decoration: underline; font-weight: bold;">discord</a> if you want to help! </p> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 14px; margin: 0; text-align: center;"> Press here to check out the latest <a href="https://docs.google.com/forms/d/e/1FAIpQLSdhCEJCV8v4XBlebRb-ho73TTMTG8nfN36jxQRyhPrV-BnNyg/viewform?usp=header" target="_blank" style="color: #4dabf7; text-decoration: underline; font-weight: bold;">survey</a>! </p> </div> </div> </div> <<set $cheatMenuUnlocked = false>> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <<set _isPlayerSide = ($tradeSide === "player")>> <<set _npcPrefs = setup.getNPCPreferences(_npc)>> <!-- Bimbo trait detection --> <<set _playerIsBimbo = $mentalTraits.includes("Bimbo")>> <<set _npcIsBimbo = _npc.mentalTraits.includes("Bimbo")>> <!-- Check if the CURRENT SIDE we're selecting from has Bimbo --> <<set _currentSideHasBimbo = (_isPlayerSide && _playerIsBimbo) || (!_isPlayerSide && _npcIsBimbo)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;"> <<if _isPlayerSide>> 🎁 Select Items for Your Offer <<else>> 🎁 Select Items You Want from _npc.name <</if>> </h1> <p style="color: white; margin: 0; font-size: 16px; text-align: center;"> Click on items to add them to the trade package </p> </div> <!-- BIMBO WARNING --> <<if _currentSideHasBimbo>> <div style="background: #3a2030; border: 2px solid #ff69b4; padding: 15px; border-radius: 8px; margin-bottom: 25px;"> <<if _isPlayerSide>> <p style="color: #ff69b4; margin: 0; font-weight: bold;">💋 You're a Bimbo! You can only trade your Name, Job, or the Bimbo trait itself.</p> <<else>> <p style="color: #ff69b4; margin: 0; font-weight: bold;">💋 _npc.name is a Bimbo! You can only request their Name, Job, or the Bimbo trait.</p> <</if>> </div> <</if>> <!-- NAME SECTION (Always available) --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">👤 Name</h2> <p style="color: #aaa; font-size: 15px; margin: 0 0 15px 0;"><em>Selecting a name automatically swaps both sides</em></p> <<if _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.name>> <div style="background: #3a2020; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">🚫 _npc.name will NEVER trade their name</p> </div> <</if>> <<set _playerHasFirstName = false>> <<set _playerHasLastName = false>> <<for _n range $playerTradePackage.name>> <<if _n.type === "firstName">><<set _playerHasFirstName = true>><</if>> <<if _n.type === "lastName">><<set _playerHasLastName = true>><</if>> <</for>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<set _nameValue = setup.getTraitValue("name", "firstName")>> <<set _npcFirstName = _npc.name.split(" ")[0]>> <<set _nameBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.name>> <<if !_playerHasFirstName && !_nameBlocked>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid #9b59b6; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: #9b59b6;'>First Name</div><div style='color: #aaa; font-size: 14px;'><<print $firstName>> ↔️ <<print _npcFirstName>></div><div style='color: #9b59b6; font-size: 13px; margin-top: 5px;'>Swap (Value: <<print _nameValue>>)</div></div>">> <<run $playerTradePackage.name.push({type: "firstName", value: $firstName})>> <<run $npcTradePackage.name.push({type: "firstName", value: _npcFirstName})>> <<goto "TradeInterface">> <</link>> <<elseif _nameBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>First Name</div> <div style='font-size: 14px;'>🚫 Blocked</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>First Name</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <<set _npcLastName = _npc.name.split(" ").slice(1).join(" ")>> <<if !_playerHasLastName && !_nameBlocked>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid #9b59b6; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: #9b59b6;'>Last Name</div><div style='color: #aaa; font-size: 14px;'><<print $lastName>> ↔️ <<print _npcLastName>></div><div style='color: #9b59b6; font-size: 13px; margin-top: 5px;'>Swap (Value: <<print _nameValue>>)</div></div>">> <<run $playerTradePackage.name.push({type: "lastName", value: $lastName})>> <<run $npcTradePackage.name.push({type: "lastName", value: _npcLastName})>> <<goto "TradeInterface">> <</link>> <<elseif _nameBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Last Name</div> <div style='font-size: 14px;'>🚫 Blocked</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Last Name</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> </div> <!-- JOB SECTION (Always available) --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">💼 Job</h2> <p style="color: #aaa; font-size: 15px; margin: 0 0 15px 0;"><em>Selecting a job automatically swaps both sides</em></p> <<set _playerJob = $jobs.length > 0 ? $jobs[0] : "Unemployed">> <<set _npcJob = _npc.jobs.length > 0 ? _npc.jobs[0] : "Unemployed">> <<set _jobAlreadySelected = ($playerTradePackage.job !== null)>> <<set _canTrade = setup.canTradeJob(_playerJob, _npcJob)>> <<set _jobBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.job>> <<if _jobBlocked>> <div style="background: #3a2020; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">🚫 _npc.name will NEVER trade their job</p> </div> <</if>> <<if !_jobAlreadySelected && _canTrade && !_jobBlocked>> <<set _playerJobValue = setup.getTraitValue("job", _playerJob)>> <<set _npcJobValue = setup.getTraitValue("job", _npcJob)>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 18px; border-radius: 8px; cursor: pointer; border: 2px solid #17a2b8; text-align: center;'><div style='font-weight: bold; font-size: 18px; margin-bottom: 5px; color: #17a2b8;'>Trade Jobs</div><div style='color: #aaa; font-size: 14px;'>_playerJob ↔️ _npcJob</div><div style='color: #17a2b8; font-size: 14px; margin-top: 5px;'>Your Value: _playerJobValue | Their Value: _npcJobValue</div></div>">> <<set $playerTradePackage.job = _playerJob>> <<set $npcTradePackage.job = _npcJob>> <<goto "TradeInterface">> <</link>> <<elseif _jobBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 18px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Trade Jobs</div> <div style='font-size: 14px;'>🚫 They Won't Trade</div> </div> <<elseif _jobAlreadySelected>> <div style='background: #1a1a1a; color: #666; padding: 18px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Trade Jobs</div> <div style='font-size: 14px;'>Already Selected</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 18px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Trade Jobs</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> <!-- BIMBO TRAIT SECTION (Only show if current side has Bimbo) --> <<if _currentSideHasBimbo>> <<set _currentPackage = _isPlayerSide ? $playerTradePackage : $npcTradePackage>> <<set _bimboInPackage = _currentPackage.mental.includes("Bimbo")>> <<set _oppositeHasBimbo = _isPlayerSide ? _npcIsBimbo : _playerIsBimbo>> <<set _bimboValue = setup.getTraitValue("mental", "Bimbo")>> <<set _npcWontAcceptBimbo = _isPlayerSide && _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.mental && _npcPrefs.wontTradeFor.mental.includes("Bimbo")>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff69b4; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff69b4; padding-bottom: 10px;">💋 Bimbo Trait</h2> <<if !_bimboInPackage && !_oppositeHasBimbo && !_npcWontAcceptBimbo>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid #ff69b4; text-align: center;'><div style='font-weight: bold; font-size: 18px; margin-bottom: 5px; color: #ff69b4;'><<if _isPlayerSide>>Trade Away Bimbo<<else>>Receive Bimbo<</if>></div><div style='color: #aaa; font-size: 14px;'>Value: _bimboValue</div><div style='color: #ff69b4; font-size: 13px; margin-top: 5px;'><<if _isPlayerSide>>Give up being a Bimbo<<else>>Become a Bimbo<</if>></div></div>">> <<if _isPlayerSide>> <<run $playerTradePackage.mental.push("Bimbo")>> <<else>> <<run $npcTradePackage.mental.push("Bimbo")>> <</if>> <<goto "TradeInterface">> <</link>> <<elseif _oppositeHasBimbo>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Bimbo Trait</div> <div style='font-size: 14px;'>They already have it</div> </div> <<elseif _npcWontAcceptBimbo>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Bimbo Trait</div> <div style='font-size: 14px;'>🚫 They won't accept this</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Bimbo Trait</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> <</if>> <!-- ALL OTHER SECTIONS (Only if NEITHER side has Bimbo) --> <<if !_currentSideHasBimbo>> <!-- BODY PARTS SECTION (Only if NEITHER side has Bimbo) --> <<if !_playerIsBimbo && !_npcIsBimbo>> <!-- Original Body Parts section stays here --> <<set _playerOfferedBodyPartTypes = []>> <<for _bp range $playerTradePackage.bodyParts>> <<run _playerOfferedBodyPartTypes.push(_bp.name)>> <</for>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">🫀 Body Parts</h2> <div style="background: #3a3020; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ffc107; margin: 0; font-weight: bold;">⚠️ Selecting a body part automatically swaps it between both of you</p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 15px;"> <!-- Chest --> <<set _partValue = setup.getTraitValue("bodyPart", "chest", $bodyParts.chest)>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("chest")>> <<set _playerChestSize = $bodyParts.chest>> <<set _npcChestSize = _npc.bodyParts.chest>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.chestSize && _npcPrefs.reluctantToTrade.chestSize.includes(_npcChestSize)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.chestSize && _npcPrefs.willingToTrade.chestSize.includes(_npcChestSize)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.chestSize && _npcPrefs.neverTrade.chestSize.includes(_npcChestSize)>> <<set _npcWontAcceptChestSize = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.chestSize && _npcPrefs.wontTradeFor.chestSize.includes(_playerChestSize)>> <<if !_alreadySelected && !_npcBlocked && !_npcWontAcceptChestSize>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Chest<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$bodyParts.chest ↔️ _npc.bodyParts.chest</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "chest", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "chest", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked || _npcWontAcceptChestSize>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Chest</div> <<if _npcBlocked>> <div style='font-size: 14px;'>🚫 They won't give up their _npcChestSize chest</div> <<else>> <div style='font-size: 14px;'>🚫 They don't want your _playerChestSize chest</div> <</if>> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Chest</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Butt --> <<set _partValue = setup.getTraitValue("bodyPart", "butt", $bodyParts.butt)>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("butt")>> <<set _playerButtSize = $bodyParts.butt>> <<set _npcButtSize = _npc.bodyParts.butt>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.buttSize && _npcPrefs.reluctantToTrade.buttSize.includes(_npcButtSize)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.buttSize && _npcPrefs.willingToTrade.buttSize.includes(_npcButtSize)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.buttSize && _npcPrefs.neverTrade.buttSize.includes(_npcButtSize)>> <<set _npcWontAcceptButtSize = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.buttSize && _npcPrefs.wontTradeFor.buttSize.includes(_playerButtSize)>> <<if !_alreadySelected && !_npcBlocked && !_npcWontAcceptButtSize>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Butt<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$bodyParts.butt ↔️ _npc.bodyParts.butt</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "butt", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "butt", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked || _npcWontAcceptButtSize>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Butt</div> <<if _npcBlocked>> <div style='font-size: 14px;'>🚫 They won't give up their _npcButtSize butt</div> <<else>> <div style='font-size: 14px;'>🚫 They don't want your _playerButtSize butt</div> <</if>> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Butt</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Gender --> <<set _partValue = setup.getTraitValue("bodyPart", "gender", "male")>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("gender")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("gender")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("gender")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("gender")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Gender<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$bodyParts.gender ↔️ _npc.bodyParts.gender</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "gender", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "gender", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Gender</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Gender</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Skin Color --> <<set _partValue = setup.getTraitValue("bodyPart", "skinTone")>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("skinTone")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("skinTone")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("skinTone")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("skinTone")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Skin Color<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$appearance.skinTone ↔️ _npc.appearance.skinTone</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "skinTone", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "skinTone", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Skin Color</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Skin Color</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Hair Color --> <<set _partValue = setup.getTraitValue("bodyPart", "hairColor")>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("hairColor")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("hairColor")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("hairColor")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("hairColor")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Hair Color<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$appearance.hairColor ↔️ _npc.appearance.hairColor</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "hairColor", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "hairColor", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Color</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Color</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Age --> <<set _partValue = setup.getTraitValue("bodyPart", "age")>> <<set _currentValue = $appearance.age || "Adult">> <<set _npcAge = _npc.appearance.age || "Adult">> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("age")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("age")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("age")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("age")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Age<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>_currentValue ↔️ _npcAge</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "age", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "age", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Age</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Age</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Hair Length --> <<set _partValue = setup.getTraitValue("bodyPart", "hairLength")>> <<set _currentValue = $appearance.hairLength || "short">> <<if !_npc.appearance.hairLength>> <<set _npc.appearance.hairLength = Math.random() < 0.5 ? "short" : "long">> <<set _hairLengthTrait = _npc.appearance.hairLength === "short" ? "Short Hair" : "Long Hair">> <<if !_npc.physicalTraits.includes(_hairLengthTrait)>> <<run _npc.physicalTraits.push(_hairLengthTrait)>> <</if>> <</if>> <<set _npcHairLength = _npc.appearance.hairLength>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("hairLength")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("hairLength")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("hairLength")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("hairLength")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Hair Length<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>_currentValue ↔️ _npcHairLength</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "hairLength", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "hairLength", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Length</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Length</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Genitals --> <<set _partValue = setup.getTraitValue("bodyPart", "genitals", $bodyParts.genitals)>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("genitals")>> <<set _playerGenitals = $bodyParts.genitals>> <<set _npcGenitals = _npc.bodyParts.genitals || "penis">> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("genitals")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("genitals")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("genitals")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Genitals<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>_playerGenitals ↔️ _npcGenitals</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (-25%)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "genitals", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "genitals", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Genitals</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Genitals</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> </div> <</if>><!-- End body parts check for Bimbo --> <!-- PHYSICAL TRAITS SECTION --> <<set _availablePhysical = _isPlayerSide ? $physicalTraits : _npc.physicalTraits>> <<set _currentPackage = _isPlayerSide ? $playerTradePackage : $npcTradePackage>> <<set _oppositePackage = _isPlayerSide ? $npcTradePackage : $playerTradePackage>> <<set _oppositeTraits = _isPlayerSide ? _npc.physicalTraits : $physicalTraits>> <<set _displayPhysicalTraits = _availablePhysical.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair" && trait !== "Cuntboy" && trait !== "Futanari"; })>> <<if _displayPhysicalTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h2> <div style="display: flex; flex-wrap: wrap; gap: 12px; margin-top: 15px;"> <<for _trait range _displayPhysicalTraits>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <<set _alreadyInPackage = _currentPackage.physical.includes(_trait)>> <<set _oppositeHasTrait = _oppositeTraits.includes(_trait)>> <<set _npcDesires = _npcPrefs && _npcPrefs.desires && _npcPrefs.desires.physical && _npcPrefs.desires.physical.includes(_trait)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.physical && _npcPrefs.willingToTrade.physical.includes(_trait)>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.physical && _npcPrefs.reluctantToTrade.physical.includes(_trait)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.physical && _npcPrefs.neverTrade.physical.includes(_trait)>> <<set _npcWontAccept = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.physical && _npcPrefs.wontTradeFor.physical.includes(_trait)>> <<set _oppositeConflict = setup.getConflictingTrait(_trait, _oppositeTraits)>> <<set _packageConflict = setup.getConflictingTrait(_trait, _currentPackage.physical)>> <<if _isPlayerSide>> <<set _actuallyBlocked = _npcWontAccept>> <<set _blockedMessage = "They don't want this">> <<set _traitColor = _npcDesires ? "#51cf66" : (_traitValue >= 0 ? "#51cf66" : "#ff6b6b")>> <<set _statusIcon = _npcDesires ? "💚" : (_npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : "")))>> <<set _statusText = _npcDesires ? "They want this! (+15%)" : (_npcWilling ? "" : (_npcReluctant ? "They're reluctant (-50%)" : (_actuallyBlocked ? "Won't accept" : "")))>> <<else>> <<set _actuallyBlocked = _npcBlocked>> <<set _blockedMessage = "They won't give this up">> <<set _traitColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : (_actuallyBlocked ? "#ff6b6b" : "#51cf66"))>> <<set _statusIcon = _npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : ""))>> <<set _statusText = _npcWilling ? "They're willing!" : (_npcReluctant ? "They're reluctant (-50%)" : (_actuallyBlocked ? "Won't trade" : ""))>> <</if>> <<if !_alreadyInPackage && !_oppositeHasTrait && !_packageConflict && !_actuallyBlocked>> <<if _isPlayerSide>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $playerTradePackage.physical.push(_trait)>> <<if _oppositeConflict>> <<run $npcTradePackage.physical.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <<else>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $npcTradePackage.physical.push(_trait)>> <<if _oppositeConflict>> <<run $playerTradePackage.physical.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <</if>> <<elseif _oppositeHasTrait>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Already Has)</span></div> <<elseif _packageConflict>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Conflicts with _packageConflict)</span></div> <<elseif _actuallyBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait 🚫 <span style='font-size: 13px;'>(_blockedMessage)</span></div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Selected)</span></div> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- MENTAL TRAITS SECTION --> <<set _availableMental = _isPlayerSide ? $mentalTraits.concat() : _npc.mentalTraits>> <<set _oppositeTraitsMental = _isPlayerSide ? _npc.mentalTraits : $mentalTraits>> <<if _isPlayerSide && $characterCreationTrait && !_availableMental.includes($characterCreationTrait)>> <<run _availableMental.push($characterCreationTrait)>> <</if>> <<if _availableMental.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h2> <div style="display: flex; flex-wrap: wrap; gap: 12px; margin-top: 15px;"> <<for _trait range _availableMental>> <<if _trait === "Perverted">> <<continue>> <</if>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<set _alreadyInPackage = _currentPackage.mental.includes(_trait)>> <<set _oppositeHasTrait = _oppositeTraitsMental.includes(_trait)>> <<set _npcDesires = _npcPrefs && _npcPrefs.desires && _npcPrefs.desires.mental && _npcPrefs.desires.mental.includes(_trait)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.mental && _npcPrefs.willingToTrade.mental.includes(_trait)>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.mental && _npcPrefs.reluctantToTrade.mental.includes(_trait)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.mental && _npcPrefs.neverTrade.mental.includes(_trait)>> <<set _npcWontAccept = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.mental && _npcPrefs.wontTradeFor.mental.includes(_trait)>> <<set _oppositeConflict = setup.getConflictingTrait(_trait, _oppositeTraitsMental)>> <<set _packageConflict = setup.getConflictingTrait(_trait, _currentPackage.mental)>> <<if _isPlayerSide>> <<set _actuallyBlocked = _npcWontAccept>> <<set _blockedMessage = "They don't want this">> <<set _traitColor = _npcDesires ? "#9b59b6" : (_traitValue >= 0 ? "#9b59b6" : "#ff6b6b")>> <<set _statusIcon = _npcDesires ? "💜" : (_npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : "")))>> <<set _statusText = _npcDesires ? "They want this! (+15%)" : (_npcWilling ? "" : (_npcReluctant ? "They're reluctant (-15%)" : (_actuallyBlocked ? "Won't accept" : "")))>> <<else>> <<set _actuallyBlocked = _npcBlocked>> <<set _blockedMessage = "They won't give this up">> <<set _traitColor = _npcWilling ? "#9b59b6" : (_npcReluctant ? "#ffc107" : (_actuallyBlocked ? "#ff6b6b" : "#9b59b6"))>> <<set _statusIcon = _npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : ""))>> <<set _statusText = _npcWilling ? "They're willing!" : (_npcReluctant ? "They're reluctant (-15%)" : (_actuallyBlocked ? "Won't trade" : ""))>> <</if>> <<if !_alreadyInPackage && !_oppositeHasTrait && !_packageConflict && !_actuallyBlocked>> <<if _isPlayerSide>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $playerTradePackage.mental.push(_trait)>> <<if _oppositeConflict>> <<run $npcTradePackage.mental.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <<else>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $npcTradePackage.mental.push(_trait)>> <<if _oppositeConflict>> <<run $playerTradePackage.mental.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <</if>> <<elseif _oppositeHasTrait>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Already Has)</span></div> <<elseif _packageConflict>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Conflicts with _packageConflict)</span></div> <<elseif _actuallyBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait 🚫 <span style='font-size: 13px;'>(_blockedMessage)</span></div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Selected)</span></div> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- SKILLS SECTION --> <<set _availableSkills = _isPlayerSide ? $skills : _npc.skills>> <<set _oppositeSkills = _isPlayerSide ? _npc.skills : $skills>> <<if _availableSkills.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h2> <div style="display: flex; flex-wrap: wrap; gap: 12px; margin-top: 15px;"> <<for _skill range _availableSkills>> <<capture _skill>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <<set _alreadyInPackage = _currentPackage.skills.includes(_skill)>> <<set _oppositeHasSkill = _oppositeSkills.includes(_skill)>> <<set _npcDesires = _npcPrefs && _npcPrefs.desires && _npcPrefs.desires.skills && _npcPrefs.desires.skills.includes(_skill)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.skills && _npcPrefs.willingToTrade.skills.includes(_skill)>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.skills && _npcPrefs.reluctantToTrade.skills.includes(_skill)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.skills && _npcPrefs.neverTrade.skills.includes(_skill)>> <<set _npcWontAccept = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.skills && _npcPrefs.wontTradeFor.skills.includes(_skill)>> <<if _isPlayerSide>> <<set _actuallyBlocked = _npcWontAccept>> <<set _blockedMessage = "They don't want this">> <<set _traitColor = _npcDesires ? "#ffc107" : "#ffc107">> <<set _statusIcon = _npcDesires ? "💛" : (_npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : "")))>> <<set _statusText = _npcDesires ? "They want this! (+30%)" : (_npcWilling ? "" : (_npcReluctant ? "They're reluctant (-20%)" : (_actuallyBlocked ? "Won't accept" : "")))>> <<else>> <<set _actuallyBlocked = _npcBlocked>> <<set _blockedMessage = "They won't give this up">> <<set _traitColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : (_actuallyBlocked ? "#ff6b6b" : "#ffc107"))>> <<set _statusIcon = _npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : ""))>> <<set _statusText = _npcWilling ? "They're willing!" : (_npcReluctant ? "They're reluctant (-20%)" : (_actuallyBlocked ? "Won't trade" : ""))>> <</if>> <<if !_alreadyInPackage && !_oppositeHasSkill && !_actuallyBlocked>> <<if _isPlayerSide>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_skill _statusIcon <span style='color: _traitColor; font-size: 13px;'>(+_skillValue)</span><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $playerTradePackage.skills.push(_skill)>> <<goto "TradeInterface">> <</link>> <<else>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_skill _statusIcon <span style='color: _traitColor; font-size: 13px;'>(+_skillValue)</span><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $npcTradePackage.skills.push(_skill)>> <<goto "TradeInterface">> <</link>> <</if>> <<elseif _oppositeHasSkill>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill <span style='font-size: 13px;'>(Already Has)</span></div> <<elseif _actuallyBlocked>> <<if _isPlayerSide && _npcWontAccept>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill 🚫 <span style='font-size: 13px;'>(They don't want this)</span></div> <<else>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill 🚫 <span style='font-size: 13px;'>(They won't give this up)</span></div> <</if>> <<else>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill <span style='font-size: 13px;'>(Selected)</span></div> <</if>> <</capture>> <</for>> </div> </div> <</if>> <</if>><!-- End !_currentSideHasBimbo conditional --> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Trade Interface</div>">> <<goto "TradeInterface">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Safety check: ensure tradeResult exists --> <<if !$tradeResult>> <div style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #dc3545;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">❌ Error</h1> <p style="color: white; margin: 0; font-size: 18px;">No trade result found</p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Go Back</div>">> <<goto $lastLocation>> <</link>> </div> <<elseif $tradeResult.success>> <!-- SUCCESS HEADER --> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">✅ Trade Successful!</h1> <p style="color: white; margin: 0; font-size: 18px;">The trade with _npc.name was successful</p> </div> <!-- Check for Bimbo trait changes --> <<set _playerGaveBimbo = $tradeResult.playerGave.mental && $tradeResult.playerGave.mental.includes("Bimbo")>> <<set _playerReceivedBimbo = $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.includes("Bimbo")>> <!-- Bimbo Transformation Section (if applicable) --> <<if _playerReceivedBimbo>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff69b4; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ff69b4; padding-bottom: 10px;">💋 Bimbo Transformation</h2> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff69b4;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getBimboTransformationText(true, $tradeResult.playerGave.mental)>> </p> </div> </div> <<elseif _playerGaveBimbo>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin-top: 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">🧠 Regaining Clarity</h2> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #17a2b8;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getBimboTransformationText(false, $tradeResult.playerReceived.mental)>> </p> </div> </div> <</if>> <!-- What You Gave --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #dc3545; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #dc3545; margin-top: 0; font-size: 24px; border-bottom: 3px solid #dc3545; padding-bottom: 10px;">📤 What You Gave</h2> <<if $tradeResult.playerGave.name && $tradeResult.playerGave.name.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">👤 Name:</strong> <<for _item range $tradeResult.playerGave.name>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #9b59b6;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _item.type === "firstName">>First Name: _item.value<<else>>Last Name: _item.value<</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.physical && $tradeResult.playerGave.physical.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💪 Physical Traits:</strong> <<for _trait range $tradeResult.playerGave.physical>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #28a745;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.mental && $tradeResult.playerGave.mental.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🧠 Mental Traits:</strong> <<for _trait range $tradeResult.playerGave.mental>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #764ba2;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.skills && $tradeResult.playerGave.skills.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🎯 Skills:</strong> <<for _skill range $tradeResult.playerGave.skills>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #ffc107;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_skill</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.bodyParts && $tradeResult.playerGave.bodyParts.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🫀 Body Parts:</strong> <<for _part range $tradeResult.playerGave.bodyParts>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #dc3545;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _part.name === "chest">>Chest: _part.value <<elseif _part.name === "butt">>Butt: _part.value <<elseif _part.name === "gender">>Gender: _part.value <<elseif _part.name === "skinTone">>Skin Color: _part.value <<elseif _part.name === "hairColor">>Hair Color: _part.value <<elseif _part.name === "hairLength">>Hair Length: <<print _part.value ? _part.value.toUpperFirst() : "Short">> <<elseif _part.name === "age">>Age: _part.value <<elseif _part.name === "genitals">>Genitals: _part.value <</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.job>> <div style="margin-bottom: 0;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💼 Job:</strong> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #17a2b8;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if $tradeResult.playerGave.job === "Unemployed">> <span style="color: #dc3545;">Unemployed</span> <<else>> $tradeResult.playerGave.job <</if>> </span> </div> </div> <</if>> </div> <!-- What You Received --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #28a745; margin-top: 0; font-size: 24px; border-bottom: 3px solid #28a745; padding-bottom: 10px;">📥 What You Received</h2> <<if $tradeResult.playerReceived.name && $tradeResult.playerReceived.name.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">👤 Name:</strong> <<for _item range $tradeResult.playerReceived.name>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #9b59b6;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _item.type === "firstName">>First Name: _item.value<<else>>Last Name: _item.value<</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.physical && $tradeResult.playerReceived.physical.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💪 Physical Traits:</strong> <<for _trait range $tradeResult.playerReceived.physical>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #28a745;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🧠 Mental Traits:</strong> <<for _trait range $tradeResult.playerReceived.mental>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #764ba2;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.skills && $tradeResult.playerReceived.skills.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🎯 Skills:</strong> <<for _skill range $tradeResult.playerReceived.skills>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #ffc107;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_skill</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.bodyParts && $tradeResult.playerReceived.bodyParts.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🫀 Body Parts:</strong> <<for _part range $tradeResult.playerReceived.bodyParts>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #dc3545;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _part.name === "chest">>Chest: _part.value <<elseif _part.name === "butt">>Butt: _part.value <<elseif _part.name === "gender">>Gender: _part.value <<elseif _part.name === "skinTone">>Skin Color: _part.value <<elseif _part.name === "hairColor">>Hair Color: _part.value <<elseif _part.name === "hairLength">>Hair Length: <<print _part.value ? _part.value.toUpperFirst() : "Short">> <<elseif _part.name === "age">>Age: _part.value <<elseif _part.name === "genitals">>Genitals: _part.value <</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.job>> <div style="margin-bottom: 0;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💼 Job:</strong> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #17a2b8;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if $tradeResult.playerReceived.job === "Unemployed">> <span style="color: #dc3545;">Unemployed</span> <<else>> $tradeResult.playerReceived.job <</if>> </span> </div> </div> <</if>> </div> <!-- Physical Transformation Descriptions (only if NOT Bimbo transformation) --> <<if !_playerReceivedBimbo && !_playerGaveBimbo && $tradeResult.playerReceived.bodyParts && $tradeResult.playerReceived.bodyParts.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">🔄 Physical Changes</h2> <<for _part range $tradeResult.playerReceived.bodyParts>> <<if _part.name === "chest">> <<set _oldSize = $tradeResult.playerGave.bodyParts.find(p => p.name === "chest").value>> <<set _newSize = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getChestTransformationText(_oldSize, _newSize)>> </p> </div> <</if>> <<if _part.name === "butt">> <<set _oldSize = $tradeResult.playerGave.bodyParts.find(p => p.name === "butt").value>> <<set _newSize = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getButtTransformationText(_oldSize, _newSize)>> </p> </div> <</if>> <<if _part.name === "gender">> <<set _oldGender = $tradeResult.playerGave.bodyParts.find(p => p.name === "gender").value>> <<set _newGender = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getGenderTransformationText(_oldGender, _newGender)>> </p> </div> <</if>> <<if _part.name === "hairLength">> <<set _oldLength = $tradeResult.playerGave.bodyParts.find(p => p.name === "hairLength").value>> <<set _newLength = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getHairLengthTransformationText(_oldLength, _newLength)>> </p> </div> <</if>> <<if _part.name === "hairColor">> <<set _oldColor = $tradeResult.playerGave.bodyParts.find(p => p.name === "hairColor").value>> <<set _newColor = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> You watch as your hair shifts from <<print _oldColor.toLowerCase()>> to <<print _newColor.toLowerCase()>>, the color bleeding through strand by strand until the transformation is complete. </p> </div> <</if>> <<if _part.name === "skinTone">> <<set _oldTone = $tradeResult.playerGave.bodyParts.find(p => p.name === "skinTone").value>> <<set _newTone = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> A tingling sensation spreads across your entire body as your skin tone shifts from <<print _oldTone.toLowerCase()>> to <<print _newTone.toLowerCase()>>, the change rippling outward from your core. </p> </div> <</if>> <<if _part.name === "age">> <<set _oldAge = $tradeResult.playerGave.bodyParts.find(p => p.name === "age").value>> <<set _newAge = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<if _newAge === "Mature Adult" && _oldAge === "Adult">> Your face feels different - more lined, more experienced. You can feel yourself aging, your features taking on a more mature quality. <<elseif _newAge === "Adult" && _oldAge === "Mature Adult">> Your skin feels tighter, smoother. Years seem to peel away as you grow younger, your features becoming more youthful. <</if>> </p> </div> <</if>> <<if _part.name === "genitals">> <<set _oldGenitals = $tradeResult.playerGave.bodyParts.find(p => p.name === "genitals").value>> <<set _newGenitals = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getGenitalTransformationText(_oldGenitals, _newGenitals)>> </p> </div> <!-- Check for special trait acquisition --> <<if $physicalTraits.includes("Cuntboy")>> <div style="background: #3a2030; border: 2px solid #9b59b6; padding: 15px; margin: 15px 0; border-radius: 8px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold; font-size: 16px;"> ✨ You've gained the "Cuntboy" trait - a male with a vagina! </p> </div> <<elseif $physicalTraits.includes("Futanari")>> <div style="background: #3a2030; border: 2px solid #9b59b6; padding: 15px; margin: 15px 0; border-radius: 8px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold; font-size: 16px;"> ✨ You've gained the "Futanari" trait - a female with a penis! </p> </div> <</if>> <</if>> <</for>> </div> <</if>> <!-- Relationship Change from Trade --> <<if $tradeResult.relationshipChange > 0>> <div style="background: #2a4a2a; border: 2px solid #51cf66; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: #51cf66; font-weight: bold; font-size: 16px;"> 💚 Trade completed! Relationship improved! (+<<print $tradeResult.relationshipChange>> points) </span> </div> <<elseif $tradeResult.relationshipChange < 0>> <div style="background: #2a4a2a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: #ff6b6b; font-weight: bold; font-size: 16px;"> 💔 Trade completed! Relationship decreased! (<<print $tradeResult.relationshipChange>> points) </span> </div> <<else>> <div style="background: #2a4a2a; border: 2px solid #888; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: #ccc; font-weight: bold; font-size: 16px;"> 💚 Trade completed! No relationship change </span> </div> <</if>> <<else>> <!-- FAILURE HEADER --> <div style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #dc3545;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">❌ Trade Failed!</h1> <p style="color: white; margin: 0; font-size: 18px;">_npc.name rejected your offer</p> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="text-align: center;"> <h2 style="color: #ffc107; margin-top: 0; font-size: 24px;">⚠️ What Happened?</h2> <p style="color: #ccc; font-size: 16px; line-height: 1.6; margin: 20px 0;"> You failed to trade with _npc.name. You've now lost your chance to trade with them today. </p> <p style="color: #aaa; font-size: 15px; font-style: italic; margin: 20px 0;"> 💡 <strong>Tip:</strong> Offer more value next time to increase your chances of success. You can't attempt another trade with _npc.name until tomorrow. </p> <div style="background: #1a1a1a; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-top: 20px;"> <p style="color: #ffc107; margin: 0; font-weight: bold;"> ⏰ Trades Remaining Today: $tradesRemainingToday / 5 </p> </div> </div> </div> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>">> <<set $lastTradedNPC = _npc>> <<set $tradingWithNPC = $lastTradedNPC>> <<set $playerTradePackage = null>> <<set $npcTradePackage = null>> <<goto "NPCInteraction">> <</link>> </div> </div> <</nobr>>
:: StoryInit <<silently>> <<set $relationships = {}>> <<set $dayCount = $dayNumber>> <<set $imageSettings = { imagesEnabled: true, useAltFaces: false, locationImagesEnabled: true, secretaryImagesEnabled: false, // Secretary job images - OFF by default npcImagesEnabled: true, // NPC character images - ON by default customImages: { face: "", chest: "", butt: "" } }>> /* ---------------------------------- */ /* --- MALL HOURS FUNCTION --- */ /* ---------------------------------- */ <<set setup.isMallOpen = function() { var minutes = State.variables.timeInMinutes; var hour = Math.floor(minutes / 60) % 24; // Mall is open from 9am (hour 9) to 5pm (hour 17) return (hour >= 9 && hour < 17); }>> /* ---------------------------------- */ /* --- LOAD SEPARATE DATA PASSAGES --- */ /* ---------------------------------- */ <<include "InitPlayerData">> <<include "InitGameSystems">> <<include "InitNPCData">> <<include "InitTimeSystem">> /* ---------------------------------- */ /* --- JOB INCOME RATES --- */ /* ---------------------------------- */ <<set setup.jobIncome = { // Tier 0 "Unemployed": 0, // Tier 1 "Street Performer": 8, "Package Courier": 10, "Construction Worker": 12, "Dock Worker": 15, "Security Guard": 12, "Baker": 10, "Maid": 10, // Tier 2 "Hooker": 25, "Stripper": 30, "Prostitute": 28, "Fitness Shop Clerk": 20, "Ecentric Shop Worker": 18, "Tech Store Clerk": 25, "Adult Store Clerk": 20, "Beauty Salon Stylist": 28, "Brothel Worker": 35, "Model": 32, "Bouncer": 30, // Tier 3 "Clinic Assistant": 55, "Data Analyst": 65, "Negotiator": 70, "Enforcer": 60, "Porn Star": 75, "Social Media Influencer": 50, "Black Market Dealer": 80, "Police Officer": 55, // Tier 4 "Brothel Owner": 150, "Mayor's Secretary": 120, "City Mayor": 200 }>> /* Get income for player's current job */ <<set setup.getJobIncome = function() { var v = State.variables; if (v.jobs && v.jobs.length > 0) { var jobName = v.jobs[0]; return setup.jobIncome[jobName] || 0; } return 0; }>> /* Work at current job and earn money */ <<set setup.workJob = function() { var v = State.variables; var income = setup.getJobIncome(); if (income > 0) { v.money += income; return income; } return 0; }>> <<set $hoursWorkedToday = 0>> <<set $lastWorkDay = 0>> <<set $lastWorkLocation = "">> <</silently>>
<<nobr>> <h1 style="color: #667eea; text-align: center;">⚙️ Trait Bonus Configuration</h1> <div style="background: #2d2d2d; padding: 20px; border-radius: 10px; color: #fff; margin-bottom: 20px;"> <p style="color: #ccc; text-align: center;">Configure stat bonuses and effects for Physical and Mental traits</p> </div> <!-- PHYSICAL TRAITS SECTION --> <div style="background: white; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #28a745;"> <h2 style="color: #28a745; margin-top: 0; border-bottom: 3px solid #28a745; padding-bottom: 10px;">💪 Physical Trait Bonuses</h2> <div style="background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #333; margin-top: 0;">Current Physical Trait Bonuses:</h3> <<set _physicalTraitsList = ["Tall", "Short", "Muscular", "Curvy", "Petite", "Broad-shouldered", "Flexible", "Strong", "Quick", "Graceful", "Sturdy", "Lean", "Soft", "Sharp Features", "Smooth Skin", "Scarred", "Pierced", "Youthful", "Mature", "Tattooed"]>> <<for _trait range _physicalTraitsList>> <div style="background: white; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #28a745;"> <h4 style="color: #28a745; margin: 0 0 10px 0;">_trait</h4> <<if setup.physicalTraitBonuses && setup.physicalTraitBonuses[_trait]>> <<set _bonuses = setup.physicalTraitBonuses[_trait]>> <div style="color: #333; margin-bottom: 10px;"> <strong>Current Bonuses:</strong><br> <<if _bonuses.charisma>>Charisma: +_bonuses.charisma<br><</if>> <<if _bonuses.dexterity>>Dexterity: +_bonuses.dexterity<br><</if>> <<if _bonuses.strength>>Strength: +_bonuses.strength<br><</if>> <<if _bonuses.intelligence>>Intelligence: +_bonuses.intelligence<br><</if>> <<if _bonuses.description>><em style="color: #666;">_bonuses.description</em><</if>> </div> <<else>> <p style="color: #999; font-style: italic; margin: 5px 0;">No bonuses configured</p> <</if>> <details style="margin-top: 10px;"> <summary style="cursor: pointer; color: #28a745; font-weight: bold;">Configure Bonuses</summary> <div style="padding: 15px; background: #f0f0f0; margin-top: 10px; border-radius: 5px;"> <<set _traitId = _trait.replace(/\s+/g, '')>> <label style="display: block; margin: 10px 0; color: #333;"> Charisma Bonus: <input type="number" @id="'cha_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Dexterity Bonus: <input type="number" @id="'dex_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Strength Bonus: <input type="number" @id="'str_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Intelligence Bonus: <input type="number" @id="'int_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Description: <input type="text" @id="'desc_' + _traitId" placeholder="Effect description" style="margin-left: 10px; padding: 5px; width: 300px;"> </label> <<capture _trait, _traitId>> <<link "<div style='background: #28a745; color: white; padding: 8px 15px; border-radius: 5px; text-align: center; margin-top: 10px; cursor: pointer;'>Save Bonuses</div>">> <<set _cha = parseInt(jQuery('#cha_' + _traitId).val()) || 0>> <<set _dex = parseInt(jQuery('#dex_' + _traitId).val()) || 0>> <<set _str = parseInt(jQuery('#str_' + _traitId).val()) || 0>> <<set _int = parseInt(jQuery('#int_' + _traitId).val()) || 0>> <<set _desc = jQuery('#desc_' + _traitId).val()>> <<if !setup.physicalTraitBonuses>> <<set setup.physicalTraitBonuses = {}>> <</if>> <<set setup.physicalTraitBonuses[_trait] = {}>> <<if _cha > 0>><<set setup.physicalTraitBonuses[_trait].charisma = _cha>><</if>> <<if _dex > 0>><<set setup.physicalTraitBonuses[_trait].dexterity = _dex>><</if>> <<if _str > 0>><<set setup.physicalTraitBonuses[_trait].strength = _str>><</if>> <<if _int > 0>><<set setup.physicalTraitBonuses[_trait].intelligence = _int>><</if>> <<if _desc && _desc.trim()>><<set setup.physicalTraitBonuses[_trait].description = _desc>><</if>> <<goto "TraitBonusManager">> <</link>> <</capture>> </div> </details> </div> <</for>> </div> </div> <!-- MENTAL TRAITS SECTION --> <div style="background: white; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #764ba2;"> <h2 style="color: #764ba2; margin-top: 0; border-bottom: 3px solid #764ba2; padding-bottom: 10px;">🧠 Mental Trait Bonuses</h2> <div style="background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #333; margin-top: 0;">Current Mental Trait Bonuses:</h3> <<set _mentalTraitsList = ["Intelligent", "Creative", "Analytical", "Empathetic", "Confident", "Shy", "Outgoing", "Patient", "Ambitious", "Curious", "Witty", "Calm", "Energetic", "Thoughtful", "Competitive", "Friendly", "Logical", "Shrewd", "Extroverted", "Introverted", "Bitchy", "Kind", "Sly", "Honest", "Dominant", "Submissive", "Aggressive", "Passive", "Optimistic", "Pessimistic", "Cruel", "Stubborn", "Flexible", "Jealous", "Supportive"]>> <<for _trait range _mentalTraitsList>> <div style="background: white; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #764ba2;"> <h4 style="color: #764ba2; margin: 0 0 10px 0;">_trait</h4> <<if setup.mentalTraitBonuses && setup.mentalTraitBonuses[_trait]>> <<set _bonuses = setup.mentalTraitBonuses[_trait]>> <div style="color: #333; margin-bottom: 10px;"> <strong>Current Bonuses:</strong><br> <<if _bonuses.charisma>>Charisma: +_bonuses.charisma<br><</if>> <<if _bonuses.dexterity>>Dexterity: +_bonuses.dexterity<br><</if>> <<if _bonuses.strength>>Strength: +_bonuses.strength<br><</if>> <<if _bonuses.intelligence>>Intelligence: +_bonuses.intelligence<br><</if>> <<if _bonuses.description>><em style="color: #666;">_bonuses.description</em><</if>> </div> <<else>> <p style="color: #999; font-style: italic; margin: 5px 0;">No bonuses configured</p> <</if>> <details style="margin-top: 10px;"> <summary style="cursor: pointer; color: #764ba2; font-weight: bold;">Configure Bonuses</summary> <div style="padding: 15px; background: #f0f0f0; margin-top: 10px; border-radius: 5px;"> <<set _traitId = _trait.replace(/\s+/g, '')>> <label style="display: block; margin: 10px 0; color: #333;"> Charisma Bonus: <input type="number" @id="'cha_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Dexterity Bonus: <input type="number" @id="'dex_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Strength Bonus: <input type="number" @id="'str_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Intelligence Bonus: <input type="number" @id="'int_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Description: <input type="text" @id="'desc_m_' + _traitId" placeholder="Effect description" style="margin-left: 10px; padding: 5px; width: 300px;"> </label> <<capture _trait, _traitId>> <<link "<div style='background: #764ba2; color: white; padding: 8px 15px; border-radius: 5px; text-align: center; margin-top: 10px; cursor: pointer;'>Save Bonuses</div>">> <<set _cha = parseInt(jQuery('#cha_m_' + _traitId).val()) || 0>> <<set _dex = parseInt(jQuery('#dex_m_' + _traitId).val()) || 0>> <<set _str = parseInt(jQuery('#str_m_' + _traitId).val()) || 0>> <<set _int = parseInt(jQuery('#int_m_' + _traitId).val()) || 0>> <<set _desc = jQuery('#desc_m_' + _traitId).val()>> <<if !setup.mentalTraitBonuses>> <<set setup.mentalTraitBonuses = {}>> <</if>> <<set setup.mentalTraitBonuses[_trait] = {}>> <<if _cha > 0>><<set setup.mentalTraitBonuses[_trait].charisma = _cha>><</if>> <<if _dex > 0>><<set setup.mentalTraitBonuses[_trait].dexterity = _dex>><</if>> <<if _str > 0>><<set setup.mentalTraitBonuses[_trait].strength = _str>><</if>> <<if _int > 0>><<set setup.mentalTraitBonuses[_trait].intelligence = _int>><</if>> <<if _desc && _desc.trim()>><<set setup.mentalTraitBonuses[_trait].description = _desc>><</if>> <<goto "TraitBonusManager">> <</link>> <</capture>> </div> </details> </div> <</for>> </div> </div> <!-- EXPORT/IMPORT SECTION --> <div style="background: white; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #ffc107;"> <h2 style="color: #e67e00; margin-top: 0; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">💾 Export/Import Configuration</h2> <div style="margin-bottom: 15px;"> <<link "<div style='background: #ffc107; color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>📋 Copy Configuration to Clipboard</div>">> <<set _config = { physical: setup.physicalTraitBonuses || {}, mental: setup.mentalTraitBonuses || {} }>> <<set _configJSON = JSON.stringify(_config, null, 2)>> <<run navigator.clipboard.writeText(_configJSON)>> <<script>>UI.alert("Configuration copied to clipboard!");<</script>> <</link>> </div> <div> <p style="color: #333; font-weight: bold;">Paste Configuration JSON:</p> <textarea id="importConfig" style="width: 100%; height: 150px; padding: 10px; font-family: monospace; background: #f8f9fa; border: 2px solid #ffc107; border-radius: 5px;" placeholder='Paste JSON configuration here...'></textarea> <<link "<div style='background: #28a745; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>📥 Import Configuration</div>">> <<set _importJSON = jQuery('#importConfig').val()>> <<try>> <<set _imported = JSON.parse(_importJSON)>> <<set setup.physicalTraitBonuses = _imported.physical || {}>> <<set setup.mentalTraitBonuses = _imported.mental || {}>> <<script>>UI.alert("Configuration imported successfully!");<</script>> <<goto "TraitBonusManager">> <<catch _error>> <<script>>UI.alert("Error importing configuration: Invalid JSON format");<</script>> <</try>> <</link>> </div> </div> <!-- NAVIGATION --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>← Back to Game</div>">> <<goto "Alleyway">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "OpahFitness">> <!-- Initialize gym membership --> <<if !$gymMembershipDaysRemaining>> <<set $gymMembershipDaysRemaining = 0>> <</if>> <!-- Initialize gym workout count for today --> <<if !$gymWorkoutCount>> <<set $gymWorkoutCount = 0>> <<set $lastGymDay = $dayNumber>> <</if>> <!-- Reset counter if it's a new day --> <<if $lastGymDay !== $dayNumber>> <<set $gymWorkoutCount = 0>> <<set $lastGymDay = $dayNumber>> <</if>> <!-- Calculate current hour --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <!-- Check if gym is open (5 AM to 9 PM) --> <<if _currentHour < 5 || _currentHour >= 21>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💪 Opah Fitness - CLOSED</h1> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 25px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 600px;"> <p style="color: #ffc107; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">🔒 Gym is Currently Closed</p> <p style="color: #aaa; font-size: 16px; margin: 0 0 20px 0;"> Opah Fitness is open from <span style="color: #ff6b6b; font-weight: bold;">5:00 AM to 9:00 PM</span> daily. </p> <p style="color: #ccc; font-size: 14px; margin: 0;"> Come back during operating hours to train! </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💪 Opah Fitness</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> The sound of clanking weights and upbeat music fills the air. Rows of treadmills, weight machines, and free weights line the spacious facility. Mirrors cover the walls, and motivational posters encourage members to push their limits. The smell of rubber mats and determination hangs in the air. </p> </div> <!-- Operating Hours Display --> <div style="background: #2a2a2a; border: 2px solid #17a2b8; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <div style="color: #17a2b8; font-size: 14px; font-weight: bold;"> 🕐 Hours: 5:00 AM - 9:00 PM </div> </div> <!-- Membership Status --> <div style="background: #2a2a2a; border: 3px solid <<if $gymMembershipDaysRemaining > 0>>#51cf66<<else>>#ff6b6b<</if>>; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if $gymMembershipDaysRemaining > 0>> <div style="color: #51cf66; font-size: 18px; font-weight: bold;"> ✅ Active Membership: <span style="color: #ffc107;"><<print $gymMembershipDaysRemaining>> days remaining</span> </div> <<else>> <div style="color: #ff6b6b; font-size: 18px; font-weight: bold; margin-bottom: 15px;"> ❌ No Active Membership </div> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0;"> Purchase a 30-day membership for $70 to access the gym facilities. </p> <<if $money >= 70>> <<link "<div style='background: #51cf66; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Purchase Membership ($70)</div>">> <<set $money -= 70>> <<set $gymMembershipDaysRemaining = 30>> <<goto "OpahFitness">> <</link>> <<else>> <div style='background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold;'>Insufficient Funds</div> <</if>> <</if>> </div> <!-- Workout Limit Display --> <<if $gymMembershipDaysRemaining > 0>> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="color: #ffc107; font-size: 18px; font-weight: bold;"> ⚡ Workout Time Remaining Today: <span style="color: #ff6b6b;"><<print 120 - ($gymWorkoutCount * 120)>> minutes / 120 minutes</span> </div> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> You can train for up to 2 hours per day. Each workout takes 2 hours. </p> </div> <h2 style="color: #ff6b6b;">Workout Programs</h2> <<if $gymWorkoutCount >= 1>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 20px; border-radius: 8px; text-align: center; margin-bottom: 25px;"> <p style="color: #ffc107; margin: 0; font-weight: bold; font-size: 18px;">You've completed your workout for today. Your muscles need rest!</p> <p style="color: #aaa; margin: 10px 0 0 0; font-size: 14px;">Come back tomorrow for more training.</p> </div> <<else>> <!-- Workout Options --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Strength Training --> <div style="border: 3px solid #ff6b6b; border-radius: 12px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 22px;">🏋️ Strength Training</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0; line-height: 1.6;"> Hit the weight room and pump iron. Focus on building raw power through heavy compound lifts like deadlifts, squats, and bench press. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #51cf66; font-size: 14px; font-weight: bold; margin-bottom: 5px;">Gains:</div> <div style="color: #aaa; font-size: 13px;">+2 Strength</div> </div> <<if $stats.strength >= $statMaxCaps.strength>> <div style="background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: auto;">Max Strength Reached</div> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto; font-size: 16px;'>Start Workout (2 hours)</div>">> <<set $stats.strength += 2>> <<set $gymWorkoutCount += 1>> <<advancetime 120>> <<if _currentHour >= 21>> <<goto "GymKickout">> <<else>> <<goto "OpahFitness">> <</if>> <</link>> <</if>> </div> <!-- Cardio Training --> <div style="border: 3px solid #51cf66; border-radius: 12px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px;">🏃 Cardio Training</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0; line-height: 1.6;"> Get your heart rate up with intense cardio sessions. Run on the treadmill, use the elliptical, or cycle to improve your agility and endurance. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #51cf66; font-size: 14px; font-weight: bold; margin-bottom: 5px;">Gains:</div> <div style="color: #aaa; font-size: 13px;">+2 Dexterity</div> </div> <<if $stats.dexterity >= $statMaxCaps.dexterity>> <div style="background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: auto;">Max Dexterity Reached</div> <<else>> <<link "<div style='background: #51cf66; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto; font-size: 16px;'>Start Workout (2 hours)</div>">> <<set $stats.dexterity += 2>> <<set $gymWorkoutCount += 1>> <<advancetime 120>> <<if _currentHour >= 21>> <<goto "GymKickout">> <<else>> <<goto "OpahFitness">> <</if>> <</link>> <</if>> </div> <!-- Mixed Training --> <div style="border: 3px solid #9b59b6; border-radius: 12px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px;">⚡ Mixed Training</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0; line-height: 1.6;"> Combine strength and cardio in a balanced circuit training routine. Get the best of both worlds with compound exercises and high-intensity intervals. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #51cf66; font-size: 14px; font-weight: bold; margin-bottom: 5px;">Gains:</div> <div style="color: #aaa; font-size: 13px;">+1 Strength, +1 Dexterity</div> </div> <<if $stats.strength >= $statMaxCaps.strength && $stats.dexterity >= $statMaxCaps.dexterity>> <div style="background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: auto;">Max Stats Reached</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto; font-size: 16px;'>Start Workout (2 hours)</div>">> <<if $stats.strength < $statMaxCaps.strength>> <<set $stats.strength += 1>> <</if>> <<if $stats.dexterity < $statMaxCaps.dexterity>> <<set $stats.dexterity += 1>> <</if>> <<set $gymWorkoutCount += 1>> <<advancetime 120>> <<if _currentHour >= 21>> <<goto "GymKickout">> <<else>> <<goto "OpahFitness">> <</if>> <</link>> <</if>> </div> </div> <</if>> <!-- Additional Services --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">🏢 Gym Services</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px;"> <!-- Personal Training with Fen Ris --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #ff6b6b; margin: 0 0 10px 0;">🐺 Personal Training</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Train with the gym's elite fitness trainer for intensive one-on-one sessions.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Meet Trainer</div>">> <<goto "FenRisTraining">> <</link>> </div> <!-- Locker Room --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #667eea; margin: 0 0 10px 0;">🚿 Locker Room</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Clean up after your workout in the locker room facilities.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter</div>">> <<goto "GymLockerRoom">> <</link>> </div> <!-- Meet NPCs --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #e91e63; margin: 0 0 10px 0;">👥 Gym Floor</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Look around for other gym members to chat with.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse</div>">> <<goto "GymNPCs">> <</link>> </div> </div> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set $lastLocation = "Cafe">> <!-- Check if player is an employee --> <<set _isEmployee = ($jobs && $jobs.includes("Barista"))>> <!-- Calculate current hour --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <!-- Check if cafe is open (6 AM to 5 PM) --> <<set _isOpen = (_currentHour >= 6 && _currentHour < 17)>> <!-- Employees can access anytime, others need to check hours --> <<if !_isOpen && !_isEmployee>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #8d6e63; text-align: center;">☕ Manta Ray Cafe - CLOSED</h1> <div style="background: #2a2a2a; border: 3px solid #8d6e63; padding: 25px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 600px;"> <p style="color: #8d6e63; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">🔒 Cafe is Currently Closed</p> <p style="color: #aaa; font-size: 16px; margin: 0 0 20px 0;"> Manta Ray Cafe is open from <span style="color: #8d6e63; font-weight: bold;">6:00 AM to 5:00 PM</span> daily. </p> <p style="color: #ccc; font-size: 14px; margin: 0;"> Come back during operating hours for coffee and conversation! </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #8d6e63; text-align: center;">☕ Manta Ray Cafe</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Cafe.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #8d6e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Manta Ray Cafe"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8d6e63;"> <p style="color: white; font-size: 18px; margin: 0;"> <<if !_isOpen && _isEmployee>> The cafe is closed to the public, but as an employee, you have access. The lights are dim and the space is quiet without customers. Equipment sits clean and ready for the next shift. <<else>> The rich aroma of freshly brewed coffee fills the air. Business professionals sit at sleek tables, laptops open, discussing deals over lattes and cappuccinos. Soft jazz plays in the background, creating an atmosphere of sophisticated productivity. <</if>> </p> </div> <!-- Operating Hours Display --> <div style="background: #2a2a2a; border: 2px solid #8d6e63; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <div style="color: #8d6e63; font-size: 14px; font-weight: bold;"> 🕐 Hours: 6:00 AM - 5:00 PM <<if _isEmployee>> <span style="color: #51cf66;"> (Employee Access: 24/7)</span> <</if>> </div> </div> <h2 style="color: #8d6e63;">Cafe Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Order Coffee --> <div style="border: 3px solid #8d6e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #8d6e63; margin: 0 0 10px 0;">☕ Order Coffee</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Grab a premium coffee to energize yourself.</p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 0 0 auto 0;">Cost: $5</p> <<if $money >= 5>> <<link "<div style='background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Order Coffee</div>">> <<set $money -= 5>> <<goto "CafeCoffee">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> <!-- Apply for Job --> <div style="border: 3px solid #4dabf7; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #4dabf7; margin: 0 0 10px 0;">💼 Apply for Barista Position</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Join the team as a barista.</p> <p style="color: #ffd43b; font-size: 14px; margin: 0 0 auto 0;">Requirements: 10 Dexterity, 10 Charisma</p> <<if $jobs && $jobs.includes("Barista")>> <div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>✓ Currently Employed</div> <<elseif setup.getTotalStat("dexterity") >= 10 && setup.getTotalStat("charisma") >= 10>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Apply Now</div>">> <<set $jobs = ["Barista"]>> <<set $homeless = false>> <<goto "CafeHired">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Stats</div> <</if>> </div> </div> <!-- Work Area (if employed) --> <<if $jobs && $jobs.includes("Barista")>> <h2 style="color: #8d6e63; margin-top: 30px;">Work Area</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">☕ Barista Station</h3> <p style="color: #aaa; margin: 0 0 15px 0;">Your workspace behind the coffee bar.</p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>⚒️ Start Work Shift</div>" "UniversalWork">><</link>> </div> </div> <</if>> <!-- NPCs Present --> <<set _baristas = setup.getNPCsByJob("Barista")>> <<if _baristas && _baristas.length > 0>> <h2 style="color: #8d6e63; margin-top: 30px;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #8d6e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _baristas>> <<capture _npc>> <div style="border: 3px solid #8d6e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #8d6e63; margin: 0 0 10px 0;"><<= _npc.name>></h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #8d6e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to <<= _npc.name>></div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #8d6e63; margin-top: 30px;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No baristas are working right now. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set $lastLocation = "Apartments">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">🏢 Sunfish Apartments</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 18px; margin: 0;"> A modest apartment building with a clean, professional lobby. The receptionist sits behind a polished desk, ready to help prospective tenants. </p> </div> <!-- Check if player already has an apartment --> <<if $hasApartment>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">🔑 Your Studio Apartment</h2> <p style="color: #ccc; margin: 0 0 10px 0;">You have a studio apartment here. Your next rent payment is due in <<print $rentDaysRemaining>> days.</p> <p style="color: #aaa; margin: 0; font-size: 14px;">Monthly Rent: $1,500 (due every 30 days)</p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Enter Apartment --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🚪 Enter Your Apartment</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Go inside your studio apartment.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Apartment</div>">> <<goto "StudioApartment">> <</link>> </div> <!-- Pay Rent Early --> <<if $rentDaysRemaining > 0>> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">💰 Pay Rent Early</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Pay next month's rent ($1,500) to extend your lease by 30 days.</p> <<if $money >= 1500>> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Pay $1,500</div>">> <<set $money -= 1500>> <<set $rentDaysRemaining += 30>> <<goto "Apartments">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Enough Money</div> <</if>> </div> <</if>> <!-- Meet the Neighbors --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">👥 Meet the Neighbors</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Visit the common area and meet your fellow tenants.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Meet Neighbors</div>">> <<goto "MeetNeighbors">> <</link>> </div> </div> <<else>> <!-- Player doesn't have an apartment - Show rental options --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #3498db; margin: 0 0 15px 0;">💼 Front Desk Receptionist</h2> <p style="color: #ccc; margin: 0 0 15px 0;">"Welcome to Sunfish Apartments! We have studio apartments available for rent."</p> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 15px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">📋 Studio Apartment Details</h3> <p style="color: #aaa; margin: 0 0 5px 0;">• Down Payment: <strong style="color: #51cf66;">$300</strong> (one-time)</p> <p style="color: #aaa; margin: 0 0 5px 0;">• Monthly Rent: <strong style="color: #51cf66;">$1,500</strong> (due every 30 days)</p> <p style="color: #aaa; margin: 0;">• First month's rent included with down payment</p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db; margin-bottom: 15px;"> <p style="color: #3498db; margin: 0; text-align: center;"> <strong>Your Money:</strong> <<print setup.formatMoney($money)>> </p> </div> <<if $money >= 300>> <<link "<div style='background: #28a745; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px;'>💳 Pay Down Payment ($300)</div>">> <<set $money -= 300>> <<set $hasApartment = true>> <<set $rentDaysRemaining = 30>> <<set $homeless = false>> <<goto "Apartments">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 15px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 18px;'>💸 Not Enough Money (Need $300)</div> <p style="color: #dc3545; margin: 15px 0 0 0; text-align: center; font-style: italic;">You need $<<print 300 - $money>> more to afford the down payment.</p> <</if>> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "DanceStudio">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b9d; text-align: center;">🎀 Ribbonfish Dance Studio</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/DanceStudio.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Ribbonfish Dance Studio"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b9d;"> <p style="color: white; font-size: 18px; margin: 0;"> Floor-to-ceiling mirrors reflect dancers practicing their craft. Soft music plays from speakers as people move gracefully across the polished hardwood floor. The energy is electric yet refined. </p> </div> <h2 style="color: #ff6b9d;">Dance Classes</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Group Dance Lessons --> <div style="border: 3px solid #ff6b9d; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #ff6b9d; margin: 0 0 10px 0;">🩰 Group Dance Lessons</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Improve your grace and dexterity through dance with other students.</p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 0 0 auto 0;">Cost: $50</p> <<if $money >= 50>> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Join Class</div>">> <<set $money -= 50>> <<goto "DanceGroupLesson">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> <!-- Private Sessions --> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #FFD700; margin: 0 0 10px 0;">👥 Private Coaching</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">One-on-one instruction with a professional dance coach for maximum results.</p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 0 0 auto 0;">Cost: $200</p> <<if $money >= 200>> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Book Session</div>">> <<set $money -= 200>> <<goto "DancePrivateLesson">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> </div> <!-- Dancing Instructors Section --> <<set _danceInstructors = []>> <<for _npc range $npcs>> <<set _hasDanceJob = false>> <<if typeof _npc.jobs === "string">> <<if _npc.jobs === "Dancing Instructor">> <<set _hasDanceJob = true>> <</if>> <<elseif Array.isArray(_npc.jobs)>> <<if _npc.jobs.includes("Dancing Instructor")>> <<set _hasDanceJob = true>> <</if>> <</if>> <<if _hasDanceJob>> <<run _danceInstructors.push(_npc)>> <</if>> <</for>> <<if _danceInstructors.length > 0>> <h2 style="color: #ff6b9d;">Instructors Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 15px; margin: 0 0 15px 0; font-style: italic;"> Professional dance instructors are available... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _danceInstructors>> <<capture _npc>> <div style="border: 3px solid #ff6b9d; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 5px 0;"> <em>Dancing Instructor</em> </p> <<link "<div style='background: #ff6b9d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "TrainingCenter">> <!-- Initialize training count for today --> <<if !$trainingCount>> <<set $trainingCount = 0>> <<set $lastTrainingDay = $dayNumber>> <</if>> <!-- Reset counter if it's a new day --> <<if $lastTrainingDay !== $dayNumber>> <<set $trainingCount = 0>> <<set $lastTrainingDay = $dayNumber>> <</if>> <!-- Initialize skill training progress --> <<if !$skillTrainingProgress>> <<set $skillTrainingProgress = { "Math Skills": {current: 0, required: 5, timesLearned: 0}, "Coding": {current: 0, required: 5, timesLearned: 0}, "Makeup": {current: 0, required: 5, timesLearned: 0}, "Cooking": {current: 0, required: 5, timesLearned: 0}, "Cleaning": {current: 0, required: 5, timesLearned: 0}, "First Aid": {current: 0, required: 5, timesLearned: 0}, "Painting": {current: 0, required: 5, timesLearned: 0} }>> <</if>> <!-- Check Quick Learner every time player enters --> <<for _skillName, _skillData range $skillTrainingProgress>> <<if $skills.includes("Quick Learner")>> <!-- Player has Quick Learner - set to 3 if not already learned --> <<if !$skills.includes(_skillName) && _skillData.required === 5>> <<set _skillData.required = 3>> <</if>> <<else>> <!-- Player doesn't have Quick Learner - set to 5 if not already learned --> <<if !$skills.includes(_skillName) && _skillData.required === 3>> <<set _skillData.required = 5>> <</if>> <</if>> <</for>> <!-- Initialize weekly class limit tracker (5 classes per week) --> <<if !$weeklyClassesTaken>> <<set $weeklyClassesTaken = {week: 0, count: 0}>> <</if>> <!-- Calculate current week number (weeks start on Monday) --> <<set _currentWeek = Math.floor($dayNumber / 7)>> <!-- Reset weekly class count if new week --> <<if $weeklyClassesTaken.week !== _currentWeek>> <<set $weeklyClassesTaken = {week: _currentWeek, count: 0}>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #5c6bc0; text-align: center;">🎓 Bluefin Development Center</h1> <div style="padding: 20px; background: linear-gradient(135deg, #5c6bc0 0%, #3f51b5 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #5c6bc0;"> <p style="color: white; font-size: 18px; margin: 0;"> Modern classrooms equipped with the latest technology line the hallways. Whiteboards display complex diagrams and business strategies. Professionals gather here to sharpen their skills and advance their careers. </p> </div> <!-- Training Limit Display --> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="color: #ffc107; font-size: 18px; font-weight: bold;"> ⚡ Stat Training Sessions Remaining Today: <span style="color: #5c6bc0;"><<print 2 - $trainingCount>> / 2</span> </div> <div style="color: #51cf66; font-size: 18px; font-weight: bold; margin-top: 10px;"> 📚 Skill Classes Remaining This Week: <span style="color: <<if $weeklyClassesTaken.count >= 5>>#ff6b6b<<else>>#5c6bc0<</if>>;"> <<print 5 - $weeklyClassesTaken.count>> / 5 </span> </div> </div> <h2 style="color: #5c6bc0;">Training Programs</h2> <!-- Stat Training --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">📊 Stat Training</h3> <p style="color: #aaa; font-size: 15px; margin: 0 0 20px 0;">Intensive programs to boost your attributes. Train up to 2 times per day for $25 each.</p> <<if $trainingCount >= 2>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 15px; border-radius: 8px; text-align: center;"> <p style="color: #ffc107; margin: 0; font-weight: bold;">You have completed all training sessions for today. Come back tomorrow!</p> </div> <<else>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Charisma Training --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #e91e63; margin: 0 0 10px 0;">💬 Charisma</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.charisma</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;">Cost: $25</p> <<if $stats.charisma >= $statMaxCaps.charisma>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif $money < 25>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set $stats.charisma += 1>> <<set $money -= 25>> <<set $trainingCount += 1>> <<advancetime 60>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Dexterity Training --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #51cf66; margin: 0 0 10px 0;">🤸 Dexterity</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.dexterity</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;">Cost: $25</p> <<if $stats.dexterity >= $statMaxCaps.dexterity>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif $money < 25>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set $stats.dexterity += 1>> <<set $money -= 25>> <<set $trainingCount += 1>> <<advancetime 60>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Strength Training --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #ff6b6b; margin: 0 0 10px 0;">💪 Strength</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.strength</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;">Cost: $25</p> <<if $stats.strength >= $statMaxCaps.strength>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif $money < 25>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set $stats.strength += 1>> <<set $money -= 25>> <<set $trainingCount += 1>> <<advancetime 60>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Intelligence Training --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #9b59b6; margin: 0 0 10px 0;">🧠 Intelligence</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.intelligence</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;">Cost: $25</p> <<if $stats.intelligence >= $statMaxCaps.intelligence>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif $money < 25>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set $stats.intelligence += 1>> <<set $money -= 25>> <<set $trainingCount += 1>> <<advancetime 60>> <<goto "TrainingCenter">> <</link>> <</if>> </div> </div> <</if>> </div> <!-- Skill Courses --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">📚 Skill Courses</h3> <p style="color: #aaa; font-size: 15px; margin: 0 0 20px 0;">Learn professional skills through multiple sessions ($75 per session, 8 hours each). You can take up to 5 classes per week total.</p> <<if $weeklyClassesTaken.count >= 5>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 20px;"> <p style="color: #ffc107; margin: 0; font-weight: bold;">You have taken all 5 classes this week. Come back next week to learn more!</p> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px;"> <!-- Math Skills --> <<set _hasSkill = $skills.includes("Math Skills")>> <<set _progress = $skillTrainingProgress["Math Skills"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; margin: 0 0 10px 0;">🔢 Math Skills</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +5 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["Math Skills"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Math Skills"].current >= $skillTrainingProgress["Math Skills"].required>> <<set $skills.push("Math Skills")>> <<set $stats.intelligence += 5>> <<set $skillTrainingProgress["Math Skills"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Coding --> <<set _hasSkill = $skills.includes("Coding")>> <<set _progress = $skillTrainingProgress["Coding"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; margin: 0 0 10px 0;">💻 Coding</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +6 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["Coding"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Coding"].current >= $skillTrainingProgress["Coding"].required>> <<set $skills.push("Coding")>> <<set $stats.intelligence += 6>> <<set $skillTrainingProgress["Coding"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Makeup --> <<set _hasSkill = $skills.includes("Makeup")>> <<set _progress = $skillTrainingProgress["Makeup"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#e91e63<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#e91e63<</if>>; margin: 0 0 10px 0;">💄 Makeup</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +3 Dexterity, +3 Charisma</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["Makeup"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Makeup"].current >= $skillTrainingProgress["Makeup"].required>> <<set $skills.push("Makeup")>> <<set $stats.dexterity += 3>> <<set $stats.charisma += 3>> <<set $skillTrainingProgress["Makeup"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Cooking --> <<set _hasSkill = $skills.includes("Cooking")>> <<set _progress = $skillTrainingProgress["Cooking"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#ffc107<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#ffc107<</if>>; margin: 0 0 10px 0;">🍳 Cooking</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +3 Intelligence, +2 Dexterity</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["Cooking"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Cooking"].current >= $skillTrainingProgress["Cooking"].required>> <<set $skills.push("Cooking")>> <<set $stats.intelligence += 3>> <<set $stats.dexterity += 2>> <<set $skillTrainingProgress["Cooking"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Cleaning --> <<set _hasSkill = $skills.includes("Cleaning")>> <<set _progress = $skillTrainingProgress["Cleaning"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#17a2b8<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#17a2b8<</if>>; margin: 0 0 10px 0;">🧹 Cleaning</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +3 Dexterity</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["Cleaning"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Cleaning"].current >= $skillTrainingProgress["Cleaning"].required>> <<set $skills.push("Cleaning")>> <<set $stats.dexterity += 3>> <<set $skillTrainingProgress["Cleaning"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- First Aid --> <<set _hasSkill = $skills.includes("First Aid")>> <<set _progress = $skillTrainingProgress["First Aid"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#dc3545<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#dc3545<</if>>; margin: 0 0 10px 0;">🏥 First Aid</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +4 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["First Aid"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["First Aid"].current >= $skillTrainingProgress["First Aid"].required>> <<set $skills.push("First Aid")>> <<set $stats.intelligence += 4>> <<set $skillTrainingProgress["First Aid"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Painting --> <<set _hasSkill = $skills.includes("Painting")>> <<set _progress = $skillTrainingProgress["Painting"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#ff6b6b<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 10px 0;">🎨 Painting</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +4 Dexterity, +3 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif $money < 75>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set $skillTrainingProgress["Painting"].current += 1>> <<set $money -= 75>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Painting"].current >= $skillTrainingProgress["Painting"].required>> <<set $skills.push("Painting")>> <<set $stats.dexterity += 4>> <<set $stats.intelligence += 3>> <<set $skillTrainingProgress["Painting"].current = 0>> <</if>> <<advancetime 480>> <<goto "TrainingCenter">> <</link>> <</if>> </div> </div> </div> <br> <!-- NPCs Present --> <<set _npcsHere = setup.getNPCsAtLocation("TrainingCenter")>> <h2 style="color: #5c6bc0;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #5c6bc0; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #5c6bc0; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #5c6bc0; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"> <<if Array.isArray(_npc.jobs)>> <<print _npc.jobs.join(", ")>> <<else>> <<print _npc.jobs>> <</if>> </p> <<link "<div style='background: #5c6bc0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The training center is empty right now. No one else is here. </p> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "TownHall">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🏛️ Town Hall</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/TownHall.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Town Hall"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #8e44ad 0%, #6c3483 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> An imposing stone building with grand columns and marble floors. The halls echo with the footsteps of bureaucrats and citizens alike. Official notices and city announcements line bulletin boards near the entrance. The air carries the weight of civic authority. </p> </div> <!-- City Mayor Work Section --> <<if $jobs && $jobs.length > 0 && $jobs.includes("City Mayor")>> <h2 style="color: #FFD700;">Mayoral Duties</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #FFD700; margin: 0 0 10px 0;">👑 Oversee City Operations</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 15px 0;">Attend to your mayoral responsibilities... or at least appear to.</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Perform Mayoral Duties</div>">> <<goto "MayorWork">> <</link>> </div> </div> <</if>> <!-- Mayor's Secretary Work Section --> <<if $jobs && $jobs.length > 0 && $jobs.includes("Mayor's Secretary")>> <h2 style="color: #9b59b6;">Secretary Work</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📋 Attend to Secretarial Duties</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 15px 0;">Handle your responsibilities as the mayor's secretary.</p> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Begin Work</div>">> <<goto "SecretaryWork">> <</link>> </div> </div> <</if>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<set _secretaryNPCs = setup.getNPCsByJob("Mayor's Secretary")>> <h2 style="color: #9b59b6;">City Government</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-top: 20px;"> <!-- Mayor's Office --> <<if _mayorNPCs.length > 0>> <<set _mayorNPC = _mayorNPCs[0]>> <<if true>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🎩 Mayor's Office</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;"><strong style="color: #9b59b6;"><<print _mayorNPC.name>></strong> - City Mayor</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">The highest authority in Sunfish City.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Meet the Mayor</div>">> <<set $tradingWithNPC = _mayorNPC>> <<goto "NPCInteraction">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🎩 Mayor's Office</h3> <p style="font-size: 14px; color: #666;">The mayor is not available right now.</p> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🎩 Mayor's Office</h3> <p style="font-size: 14px; color: #666;">No mayor currently appointed.</p> </div> <</if>> <!-- Secretary's Office --> <<if _secretaryNPCs.length > 0>> <<set _secretaryNPC = _secretaryNPCs[0]>> <<if true>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📋 Secretary's Office</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;"><strong style="color: #9b59b6;"><<print _secretaryNPC.name>></strong> - Mayor's Secretary</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">Handles appointments and city business.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Talk to Secretary</div>">> <<set $tradingWithNPC = _secretaryNPC>> <<goto "NPCInteraction">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">📋 Secretary's Office</h3> <p style="font-size: 14px; color: #666;">The secretary is not available right now.</p> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">📋 Secretary's Office</h3> <p style="font-size: 14px; color: #666;">No secretary currently appointed.</p> </div> <</if>> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Gym">> <h1>💪 Training Complete!</h1> <div style="padding: 25px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); text-align: center;"> <h2 style="color: white; margin: 0 0 10px 0; font-size: 32px;">✅ Workout Session Complete</h2> <p style="color: white; margin: 0; font-size: 18px;">You've finished your training</p> </div> <!-- Training Message Based on Strength Level --> <div style="background: white; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <<if $stats.strength >= 100>> <h2 style="color: #ffd700; margin-top: 0; text-align: center;">🏆 LEGENDARY PHYSIQUE</h2> <p style="color: #333; font-size: 16px; line-height: 1.8; text-align: center;"> You've achieved the pinnacle of human strength. Your body is a perfect sculpture of muscle and power. Other gym-goers stop their workouts just to watch you in awe. The weights you lift seem impossibly heavy to everyone else, yet you handle them with casual ease. You've transcended ordinary fitness - you're a living legend. </p> <<elseif $stats.strength >= 71>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">💪 ELITE ATHLETE</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You crush your workout with incredible intensity. The heavy weights that once seemed impossible now feel manageable. Your form is impeccable, every rep controlled and powerful. Other gym members frequently ask you for advice, recognizing your expertise. Your body has transformed into a powerhouse of muscle and definition. You're approaching the limits of natural human strength. </p> <<elseif $stats.strength >= 51>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">🔥 ADVANCED LIFTER</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You power through an intense training session. The weights feel heavy but manageable as you push yourself harder than before. Your muscles burn with satisfying exertion. You're noticing significant changes in your physique - more definition, more mass, more power. People are starting to notice your transformation. You're becoming a regular force in the gym. </p> <<elseif $stats.strength >= 21>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">💪 INTERMEDIATE GAINS</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You complete a solid workout, feeling the satisfying pump in your muscles. The exercises are getting easier as your body adapts and grows stronger. You're starting to see real changes in the mirror - your arms are filling out your sleeves a bit more, your shoulders are broader. The initial soreness is fading, replaced by a sense of capability and confidence. </p> <<else>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">🌱 BEGINNER GAINS</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You work through your training routine, muscles trembling from the unfamiliar exertion. Everything feels heavy and awkward, but you push through it. Sweat pours down your face as you struggle with weights that more experienced lifters handle easily. Your form needs work, but you're learning. By the end, you're exhausted but proud - you showed up and did the work. That's what matters at this stage. </p> <</if>> </div> <!-- Stats Display --> <div style="background: white; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745;"> <h3 style="color: #28a745; margin-top: 0; text-align: center;">📊 Strength Progress</h3> <div style="text-align: center;"> <p style="color: #333; font-size: 18px; margin: 10px 0;"> <strong>Previous Strength:</strong> <span style="color: #666;"><<print $stats.strength - 1>></span> </p> <p style="color: #28a745; font-size: 24px; font-weight: bold; margin: 10px 0;"> ⬆️ +1 Strength </p> <p style="color: #333; font-size: 18px; margin: 10px 0;"> <strong>Current Strength:</strong> <span style="color: #e74c3c; font-weight: bold;">$stats.strength</span> / $statMaxCaps.strength </p> </div> </div> <!-- Time Display --> <div style="background: #fff3cd; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <p style="color: #856404; margin: 0; font-weight: bold;"> ⏰ Time passed: 1 hour </p> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>Continue Training</div>">> <<goto "Gym">> <</link>> <br><br> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>Leave Gym</div>">> <<goto "BusinessDistrict">> <</link>> </div> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <<if !_npc>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: No NPC selected.</p> [[Go Back|$lastLocation]] </div> <<else>> <<set _relationship = $relationships[_npc.name] || {level: 1, points: 0}>> <<set _relLevel = _relationship.level>> <<set _npcPrefs = setup.getNPCPreferences(_npc)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header with Relationship Display --> <div style="background: #2a2a2a; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 15px 0; font-size: 32px; text-align: center;">💬 Talking with _npc.name</h1> <!-- Relationship Level and XP Bar --> <<set _relColor = setup.getRelationshipColor(_relLevel)>> <div style="text-align: center; margin-bottom: 15px;"> <div style="color: #667eea; font-size: 18px; font-weight: bold; margin-bottom: 8px;"> Relationship: Level _relLevel </div> <!-- XP Progress Bar --> <<if _relLevel < 5>> <<set _nextThreshold = [25, 75, 175, 425][_relLevel - 1]>> <<set _currentLevelMin = [0, 25, 75, 175][_relLevel - 1]>> <<set _xpInLevel = _relationship.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <div style="background: #000000; border: 2px solid #51cf66; border-radius: 10px; height: 30px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);"> <div @style="'background: linear-gradient(90deg, #51cf66 0%, #40c057 100%); height: 100%; width: ' + _xpPercent + '%; transition: width 0.3s ease; position: absolute; left: 0; top: 0;'"></div> <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: bold; font-size: 14px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8); z-index: 10;"> <<print _xpInLevel>> / <<print _xpNeededForLevel>> XP (<<print _xpPercent>>%) </div> </div> <<else>> <div style="background: #000000; border: 2px solid #51cf66; border-radius: 10px; height: 30px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);"> <div style="background: linear-gradient(90deg, #51cf66 0%, #40c057 100%); height: 100%; width: 100%; position: absolute; left: 0; top: 0;"></div> <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: bold; font-size: 14px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8); z-index: 10;"> MAX LEVEL </div> </div> <</if>> </div> </div> <!-- NPC's Initial Reaction based on your appearance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px;">_npc.name's Reaction</h3> <div style="color: #ccc; font-size: 16px; line-height: 1.8; font-style: italic;"> "<<print setup.getNPCGreeting(_npc, _relLevel)>>" </div> </div> <!-- Conversation Topics --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 20px 0; font-size: 22px; border-bottom: 2px solid #17a2b8; padding-bottom: 10px;">💭 What do you want to talk about?</h3> <div style="display: grid; gap: 15px;"> <!-- Compliment them (increases relationship) --> <<link "<div style='background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66; cursor: pointer;'><span style='color: #51cf66; font-weight: bold;'>😊</span> <span style='color: #ccc;'>Give them a compliment</span></div>">> <<set $currentTopic = "compliment">> <<goto "NPCTalkResponse">> <</link>> <!-- Ask about your appearance --> <<link "<div style='background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #9b59b6; cursor: pointer;'><span style='color: #9b59b6; font-weight: bold;'>👤</span> <span style='color: #ccc;'>Ask what they think of you</span></div>">> <<set $currentTopic = "opinion">> <<goto "NPCTalkResponse">> <</link>> <!-- Small talk --> <<link "<div style='background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #667eea; cursor: pointer;'><span style='color: #667eea; font-weight: bold;'>☕</span> <span style='color: #ccc;'>Make small talk</span></div>">> <<set $currentTopic = "smalltalk">> <<goto "NPCTalkResponse">> <</link>> <!-- Ask about their job --> <<link "<div style='background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #17a2b8; cursor: pointer;'><span style='color: #17a2b8; font-weight: bold;'>💼</span> <span style='color: #ccc;'>Ask about their job</span></div>">> <<set $currentTopic = "job">> <<goto "NPCTalkResponse">> <</link>> <!-- Ask about trading preferences --> <<link "<div style='background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; cursor: pointer;'><span style='color: #ffc107; font-weight: bold;'>💱</span> <span style='color: #ccc;'>Ask what they're interested in trading</span></div>">> <<set $currentTopic = "trading">> <<goto "NPCTalkResponse">> <</link>> </div> </div> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto "NPCInteraction">> <</link>> </div> </div> <</if>> <</nobr>>
<div style="display: grid; gap: 15px; margin: 0; padding: 0;"> <<for _traitName, _traitDesc range $availableTraits>><<capture _traitName, _traitDesc>><<set _isSelected = $selectedTraits.includes(_traitName)>><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid <<if _isSelected>>#51cf66<<else>>#666<</if>>;"><div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"><strong style="color: <<if _isSelected>>#51cf66<<else>>#ccc<</if>>; font-size: 18px;">_traitName</strong><<if _isSelected>><<link "<span style='color: #ff6b6b; font-weight: bold; font-size: 16px;'>REMOVE</span>">><<run $selectedTraits.delete(_traitName)>><<replace "#trait-list">><<include "TraitListDisplay">><</replace>><<replace "#trait-counter">><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"><p style="color: #51cf66; margin: 0; font-size: 16px; font-weight: bold;">You have currently chosen <span style="color: #ffc107;"><<print $selectedTraits.length>></span> out of 1 trait.</p></div><</replace>><</link>><<else>><<link "<span style='color: #51cf66; font-weight: bold; font-size: 16px;'>SELECT</span>">><<if $selectedTraits.length < $maxTraits>><<run $selectedTraits.push(_traitName)>><<replace "#trait-list">><<include "TraitListDisplay">><</replace>><<replace "#trait-counter">><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"><p style="color: #51cf66; margin: 0; font-size: 16px; font-weight: bold;">You have currently chosen <span style="color: #ffc107;"><<print $selectedTraits.length>></span> out of 1 trait.</p></div><</replace>><<else>><<script>>UI.alert("You can only select 1 trait!");<</script>><</if>><</link>><</if>></div><p style="color: #aaa; margin: 0; font-style: italic; font-size: 15px;">_traitDesc</p></div><</capture>><</for>> </div>
<<nobr>> <<set $lastLocation = "ShadyShop">> <h1>🕶️ Shady Shop</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 20px;"> <p style="color: #ccc; font-size: 18px; margin: 0;"> The dim interior reeks of cigarette smoke and desperation. An old man sits behind the counter, cackling to himself. His eyes light up when he sees you. "Welcome, welcome! Looking for a little excitement? A little chaos in your life? I can help with that... hehehehe!" </p> </div> <h2>Shop Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <div style="border: 2px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; opacity: 0.6;"> <h3 style="color: #666; margin-top: 0;">🎲 Shady Deal</h3> <p style="font-size: 14px; color: #ccc;">The old man loves chaos. Gain a positive trait, but receive a negative one too.</p> <p style="font-size: 13px; color: #999; font-style: italic; margin: 8px 0;">This feature will be fixed in a future update.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Disabled</div> </div> <div style="border: 2px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff4444; margin-top: 0;">💊 Black Market Goods</h3> <p style="font-size: 14px; color: #ccc;">Questionable items of dubious origin.</p> <p style="font-size: 13px; color: #999; font-style: italic;">Coming soon...</p> </div> <div style="border: 2px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff4444; margin-top: 0;">🔓 Illegal Services</h3> <p style="font-size: 14px; color: #ccc;">Off-the-books transactions and services.</p> <<link "<div style='background: #ff4444; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter</div>">> <<goto "IllegalServices">> <</link>> </div> <div style="border: 2px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff4444; margin-top: 0;">💰 Fence Stolen Goods</h3> <p style="font-size: 14px; color: #ccc;">Sell items without asking questions.</p> <p style="font-size: 13px; color: #999; font-style: italic;">Coming soon...</p> </div> </div> <br><br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #434343; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ShadyDeal">> <!-- Initialize shady deals counter if it doesn't exist --> <<if !$shadyDealsToday>> <<set $shadyDealsToday = 0>> <<set $lastShadyDealDay = $dayNumber>> <</if>> <!-- Reset counter if it's a new day --> <<if $lastShadyDealDay !== $dayNumber>> <<set $shadyDealsToday = 0>> <<set $lastShadyDealDay = $dayNumber>> <</if>> <h1>🕶️ Shady Deal</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 20px; border: 2px solid #ff4444;"> <p style="color: #ccc; font-size: 18px; margin: 0;"> The old man cackles with glee, his eyes gleaming with malicious amusement. "Hehehehe... I just love watching people squirm! I got connections to some real special folks. They can change you... make you better, make you worse. Who knows?" He grins wickedly. "I just do it for the entertainment, ya know? Watching you deal with the consequences... priceless!" </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107;"> <h2 style="color: #ffc107; margin-top: 0;">⚠️ How It Works</h2> <ul style="color: #ccc; font-size: 15px;"> <li><strong>You will receive:</strong> One random positive physical or mental trait (value: 1-20+)</li> <li><strong>You will also receive:</strong> One random negative trait (value: -20 to -1)</li> <li><strong>Cost:</strong> FREE - The old man just likes the chaos</li> <li><strong>Limit:</strong> 3 deals per day</li> <li><strong>Warning:</strong> The negative trait could be severe. This is pure gambling.</li> </ul> </div> <div style="background: #3a3a3a; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 20px; border: 2px solid #666;"> <p style="color: #ffc107; font-size: 18px; font-weight: bold; margin: 0;"> 🎲 Deals Remaining Today: <<print 3 - $shadyDealsToday>> / 3 </p> </div> <<if $shadyDealsToday < 3>> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🎲 Roll the Dice (FREE)</div>">> <<set $shadyDealsToday += 1>> <!-- Get all positive traits player doesn't have --> <<set _positivePhysical = ["Tall", "Curvy", "Lean", "Muscular", "Soft", "Sharp Features", "Smooth Skin", "Pierced", "Youthful", "Mature", "Tan Skin", "Dark Skin", "Pale Skin", "Attractive", "Fit", "Graceful", "Strong", "Flexible", "Freckled", "Tattooed", "Athletic Build", "Petite", "Voluptuous", "Broad-shouldered", "Quick", "Sturdy"]>> <<set _positiveMental = ["Extroverted", "Kind", "Sly", "Dominant", "Confident", "Optimistic", "Empathetic", "Supportive", "Friendly", "Competitive", "Logical", "Shrewd", "Hardworking", "Humble", "Trusting", "Ambitious", "Creative", "Brave", "Patient", "Wise", "Intelligent", "Analytical", "Outgoing", "Curious", "Witty", "Calm", "Energetic", "Thoughtful"]>> <<set _negativePhysical = ["Plain", "Ugly", "Overweight", "Underweight", "Clumsy", "Weak", "Stiff", "Blemished", "Short", "Scarred"]>> <<set _negativeMental = ["Bitchy", "Cruel", "Jealous", "Lazy", "Arrogant", "Complacent", "Dull", "Cowardly", "Immature", "Impatient", "Foolish", "Introverted", "Submissive", "Shy", "Aggressive", "Passive", "Pessimistic", "Stubborn", "Paranoid"]>> <!-- Filter out traits player already has --> <<set _availablePositivePhysical = []>> <<for _trait range _positivePhysical>> <<if !$physicalTraits.includes(_trait)>> <<run _availablePositivePhysical.push(_trait)>> <</if>> <</for>> <<set _availablePositiveMental = []>> <<for _trait range _positiveMental>> <<if !$mentalTraits.includes(_trait)>> <<run _availablePositiveMental.push(_trait)>> <</if>> <</for>> <<set _availableNegativePhysical = []>> <<for _trait range _negativePhysical>> <<if !$physicalTraits.includes(_trait)>> <<run _availableNegativePhysical.push(_trait)>> <</if>> <</for>> <<set _availableNegativeMental = []>> <<for _trait range _negativeMental>> <<if !$mentalTraits.includes(_trait)>> <<run _availableNegativeMental.push(_trait)>> <</if>> <</for>> <!-- Combine all available positive and negative traits --> <<set _allPositive = _availablePositivePhysical.concat(_availablePositiveMental)>> <<set _allNegative = _availableNegativePhysical.concat(_availableNegativeMental)>> <<if _allPositive.length === 0 || _allNegative.length === 0>> <<set $shadyDealResult = { success: false, reason: "insufficient_traits" }>> <<else>> <!-- Pick random positive trait --> <<set _positiveTrait = _allPositive[Math.floor(Math.random() * _allPositive.length)]>> <<set _isPositivePhysical = _availablePositivePhysical.includes(_positiveTrait)>> <!-- Pick random negative trait --> <<set _negativeTrait = _allNegative[Math.floor(Math.random() * _allNegative.length)]>> <<set _isNegativePhysical = _availableNegativePhysical.includes(_negativeTrait)>> <!-- Add traits to player --> <<if _isPositivePhysical>> <<run $physicalTraits.push(_positiveTrait)>> <<else>> <<run $mentalTraits.push(_positiveTrait)>> <</if>> <<if _isNegativePhysical>> <<run $physicalTraits.push(_negativeTrait)>> <<else>> <<run $mentalTraits.push(_negativeTrait)>> <</if>> <!-- Calculate values --> <<set _positiveValue = setup.getTraitValue(_isPositivePhysical ? "physical" : "mental", _positiveTrait)>> <<set _negativeValue = setup.getTraitValue(_isNegativePhysical ? "physical" : "mental", _negativeTrait)>> <<set $shadyDealResult = { success: true, positiveTrait: _positiveTrait, positiveType: _isPositivePhysical ? "Physical" : "Mental", positiveValue: _positiveValue, negativeTrait: _negativeTrait, negativeType: _isNegativePhysical ? "Physical" : "Mental", negativeValue: _negativeValue }>> <</if>> <<goto "ShadyDealResult">> <</link>> </div> <<else>> <div style="background: #3a3a3a; padding: 20px; border-radius: 12px; text-align: center; border: 2px solid #666;"> <p style="color: #ff6b6b; font-size: 18px; margin: 0;"> ❌ You've used all your deals for today. </p> <p style="color: #999; font-size: 14px; margin: 10px 0 0 0;"> <em>The old man cackles: "That's enough chaos for one day! Come back tomorrow if you want more!"</em> </p> </div> <</if>> <br><br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #434343; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Shop</div>">> <<goto "ShadyShop">> <</link>> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <<if $shadyDealResult.success>> <!-- SUCCESS --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 3px solid #ff4444;"> <h1 style="color: #ff4444; margin: 0 0 10px 0; font-size: 36px;">🎲 The Deal is Done</h1> <p style="color: #ccc; margin: 0; font-size: 18px;">The shopkeeper smiles wickedly as the transformation takes hold...</p> </div> <!-- What You Gained --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #51cf66; padding-bottom: 10px;">✅ What You Gained</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #51cf66; text-align: center;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; font-size: 22px;">$shadyDealResult.positiveTrait</h3> <p style="color: #aaa; margin: 5px 0; font-size: 16px;"> <strong>Type:</strong> $shadyDealResult.positiveType Trait </p> <p style="color: #51cf66; margin: 5px 0; font-size: 18px; font-weight: bold;"> Trade Value: +$shadyDealResult.positiveValue </p> </div> </div> <!-- What You Lost --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">❌ The Price You Paid</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 22px;">$shadyDealResult.negativeTrait</h3> <p style="color: #aaa; margin: 5px 0; font-size: 16px;"> <strong>Type:</strong> $shadyDealResult.negativeType Trait </p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 18px; font-weight: bold;"> Trade Value: $shadyDealResult.negativeValue </p> </div> </div> <!-- Net Result --> <<set _netValue = $shadyDealResult.positiveValue + $shadyDealResult.negativeValue>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; text-align: center; border: 3px solid <<if _netValue >= 0>>#17a2b8<<else>>#ffc107<</if>>; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: <<if _netValue >= 0>>#17a2b8<<else>>#ffc107<</if>>; margin: 0 0 10px 0;">📊 Net Result</h3> <p style="color: #ccc; font-size: 20px; font-weight: bold; margin: 0;"> <<if _netValue > 0>> You came out ahead! Net value: <span style="color: #51cf66;">+_netValue</span> <<elseif _netValue === 0>> It is a wash. Net value: <span style="color: #ffc107;">0</span> <<else>> You got the short end of the stick. Net value: <span style="color: #ff6b6b;">_netValue</span> <</if>> </p> </div> <<else>> <!-- FAILURE --> <div style="background: linear-gradient(135deg, #ff6b6b 0%, #dc3545 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 3px solid #ff6b6b;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">❌ Deal Cancelled</h1> <p style="color: white; margin: 0; font-size: 18px;">You do not have enough available traits to make this deal.</p> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; text-align: center; font-size: 16px; margin: 0;"> The shopkeeper shrugs. "Come back when you are less full of yourself. Or more full of problems. Either way." </p> </div> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue</div>">> <<goto "ShadyShop">> <</link>> </div> </div> <</nobr>>
<!-- Reset shady deals counter --> <<set $shadyDealsToday = 0>>
https://www.patreon.com/Grankor
https://discord.gg/z9eDdQC6zA
''Alpha Version: 0.0.15''
Description for Future Reference: NPC Image System Structure: Static NPCs (NPCs whose appearance never changes): Path: Images/NPCs/StaticNPCs/[NPC_Name].webp Example: Images/NPCs/StaticNPCs/Revna_McKraken.webp Add NPC names to the staticNPCs array in the setup.getNPCImage() function Dynamic NPCs (NPCs whose appearance can change): Path: Images/NPCs/[NPC_Name]/BaseNPC.webp Example: Images/NPCs/John_Doe/BaseNPC.webp Each NPC has their own folder containing their various appearance images The starting/default image is always named BaseNPC.webp Additional appearance variations can be added to the same folder later Name formatting: Spaces in NPC names are replaced with underscores for file paths Image toggle: All NPC images respect the $imageSettings.imagesEnabled setting and won't display when images are disabled
<<nobr>> <<set $lastLocation = "Brothel">> <!-- Initialize Brothel Work System --> <<if !$brothelLevel>> <<set $brothelLevel = 1>> <<set $brothelClients = 0>> <<set $brothelClientsToday = 0>> <<set $brothelLastWorkDay = 0>> <</if>> <!-- Reset daily client count if new day --> <<if $brothelLastWorkDay !== $dayNumber>> <<set $brothelClientsToday = 0>> <<set $brothelLastWorkDay = $dayNumber>> <</if>> <!-- Calculate max clients per day --> <<set _maxBrothelClients = 4>> <<if $skills.includes("Sexually Skilled")>> <<set _maxBrothelClients += 2>> <</if>> <<if $mentalTraits.includes("Energetic")>> <<set _maxBrothelClients += 2>> <</if>> <!-- Calculate bonus money from relevant traits/skills --> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _brothelBonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait) || $skills.includes(_trait)>> <<set _brothelBonusMoney += 15>> <</if>> <</for>> <!-- Check for level up (silent) --> <<if $brothelLevel === 1 && $brothelClients >= 25>> <<set $brothelLevel = 2>> <<elseif $brothelLevel === 2 && $brothelClients >= 50>> <<set $brothelLevel = 3>> <<elseif $brothelLevel === 3 && $brothelClients >= 150>> <<set $brothelLevel = 4>> <<elseif $brothelLevel === 4 && $brothelClients >= 300>> <<set $brothelLevel = 5>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #007FFF; text-align: center;">💋 Azure Angelfish Lounge</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Brothel.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Azure Angelfish Lounge"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #007FFF;"> <p style="color: white; font-size: 18px; margin: 0;"> Plush velvet furniture and dim mood lighting create an atmosphere of luxury and discretion. Well-dressed hosts and hostesses attend to clients with professional grace. The air carries hints of expensive perfume and champagne. </p> </div> <!-- Management Area (Only shows if player has Brothel Owner job) --> <<if $jobs && $jobs.length > 0 && $jobs.includes("Brothel Owner")>> <h2 style="color: #FFD700;">Brothel Management</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #FFD700; margin: 0 0 10px 0;">👑 Manage Your Business</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 15px 0;">Oversee operations, finances, and staff at the Azure Angelfish Lounge.</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Enter Management Office</div>">> <<goto "BrothelManagement">> <</link>> </div> </div> <</if>> <!-- Work Area (Only shows if player has Brothel Worker job) --> <<if $jobs && $jobs.length > 0 && $jobs.includes("Brothel Worker")>> <h2 style="color: #007FFF;">Your Work</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <!-- Level & Progress Display --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #007FFF;"> <h3 style="color: #007FFF; margin: 0 0 10px 0;">Professional Level: $brothelLevel</h3> <p style="color: #ccc; margin: 0 0 5px 0;">Total Clients Served: $brothelClients</p> <p style="color: #ffc107; margin: 0;"> Today's Sessions: $brothelClientsToday / _maxBrothelClients <<if _brothelBonusMoney > 0>> <span style="color: #51cf66;"> (+$<<print _brothelBonusMoney>> per client from skills)</span> <</if>> </p> </div> <!-- Work Button --> <<if $brothelClientsToday >= _maxBrothelClients>> <div style="background: #1a1a1a; border: 3px solid #666; padding: 15px; border-radius: 8px; text-align: center;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">You're exhausted for today. Come back tomorrow.</p> </div> <<else>> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💼 Wait for Client</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 15px 0;">Take the next available client. Each session lasts 1 hour.</p> <<link "<div style='background: #e91e63; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Service Next Client</div>">> <<if $brothelLevel === 1>> <<goto "BrothelWorkLevel1">> <<elseif $brothelLevel === 2>> <<goto "BrothelWorkLevel2">> <<elseif $brothelLevel === 3>> <<goto "BrothelWorkLevel3">> <<elseif $brothelLevel === 4>> <<goto "BrothelWorkLevel4">> <<else>> <<goto "BrothelWorkLevel5">> <</if>> <</link>> </div> <</if>> </div> <</if>> <!-- NPCs Present --> <<set _brothelWorkers = setup.getNPCsByJob("Brothel Worker")>> <<set _brothelOwner = setup.getNPCsByJob("Brothel Owner")>> <<set _npcsHere = _brothelWorkers.concat(_brothelOwner)>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #007FFF;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #007FFF; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #007FFF; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #007FFF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #007FFF;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The lounge is quiet right now. No one is available. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #ff1493; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClub">> <!-- Check if player is an employee --> <<set _isEmployee = ($jobs.includes("Stripper") || $jobs.includes("Bouncer"))>> <!-- Calculate current hour --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <!-- Check if it's a weekend --> <<set _isWeekend = ($dayOfWeek === "Saturday" || $dayOfWeek === "Sunday")>> <<set _isOpen = false>> <!-- Determine if club is open based on day and time --> <<if _isWeekend>> <!-- Weekend: 3 PM to 5 AM --> <<if _currentHour >= 15 || _currentHour < 5>> <<set _isOpen = true>> <</if>> <<else>> <!-- Weekday: 5 PM to 3 AM --> <<if _currentHour >= 17 || _currentHour < 3>> <<set _isOpen = true>> <</if>> <</if>> <!-- Employees can access anytime, others need to check hours --> <<if !_isOpen && !_isEmployee>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">🪼 Electric Jelly Revue - CLOSED</h1> <div style="background: #2a2a2a; border: 3px solid #9D00FF; padding: 25px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 700px;"> <p style="color: #9D00FF; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">🔒 Club is Currently Closed</p> <p style="color: #aaa; font-size: 16px; margin: 0 0 20px 0;"> Electric Jelly Revue operating hours: </p> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #FFD700; font-weight: bold; margin: 0 0 10px 0;">📅 Weekdays (Mon-Fri)</p> <p style="color: #ccc; font-size: 14px; margin: 0;">5:00 PM - 3:00 AM</p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px;"> <p style="color: #FFD700; font-weight: bold; margin: 0 0 10px 0;">🎉 Weekends (Sat-Sun)</p> <p style="color: #ccc; font-size: 14px; margin: 0;">3:00 PM - 5:00 AM</p> </div> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #ff1493; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">🪼 Electric Jelly Revue</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/StripClub.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Electric Jelly Revue"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0;"> <<if !_isOpen && _isEmployee>> The club is closed to the public, but as an employee, you have access. The space is quiet without the usual crowds, with only staff present for prep work or cleanup. <<else>> Bass-heavy music throbs through the air as colorful lights pulse across the stage. Dancers move gracefully on chrome poles while patrons sip drinks and watch from plush booths. The atmosphere is electric with energy and anticipation. <</if>> </p> </div> <!-- Operating Hours Display --> <div style="background: #2a2a2a; border: 2px solid #9D00FF; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <div style="color: #9D00FF; font-size: 14px; font-weight: bold;"> <<if _isWeekend>> 🕐 Weekend Hours: 3:00 PM - 5:00 AM <<else>> 🕐 Weekday Hours: 5:00 PM - 3:00 AM <</if>> <<if _isEmployee>> <span style="color: #FFD700;"> (Employee Access: 24/7)</span> <</if>> </div> </div> <!-- Work Section (only shows if player has Stripper or Bouncer job) --> <<if $jobs.includes("Stripper") || $jobs.includes("Bouncer")>> <h2 style="color: #9D00FF;">Work</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <<if $jobs.includes("Stripper")>> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #9D00FF; margin: 0 0 10px 0;">💃 Work as Stripper</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Perform on stage and entertain the crowds.</p> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Shift</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> <</if>> <<if $jobs.includes("Bouncer")>> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #9D00FF; margin: 0 0 10px 0;">🛡️ Work as Bouncer</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Maintain security and keep the peace.</p> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Shift</div>">> <<goto "StripClubWorkBouncer">> <</link>> </div> <</if>> </div> <</if>> <h2 style="color: #9D00FF;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- VIP Lounge --> <<if $stripClubVIPMember || $jobs.includes("Stripper") || $jobs.includes("Bouncer")>> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #FFD700; margin: 0 0 10px 0;">👑 VIP Lounge</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;"> <<if $jobs.includes("Stripper") || $jobs.includes("Bouncer")>> Access the exclusive VIP area (Employee Access). <<else>> Access the exclusive VIP area with private entertainment. <</if>> </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter VIP Lounge</div>">> <<goto "StripClubVIP">> <</link>> </div> <<else>> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #9D00FF; margin: 0 0 10px 0;">👑 VIP Lounge</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Exclusive access to private entertainment and premium services.</p> <p style="color: #FFD700; font-size: 16px; font-weight: bold; margin: 0 0 auto 0;">VIP Membership: $5,000</p> <<if $money >= 5000>> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Purchase VIP Membership</div>">> <<set $money -= 5000>> <<set $stripClubVIPMember = true>> <<goto "StripClub">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> <</if>> </div> <!-- NPCs Present --> <<set _strippers = setup.getNPCsByJob("Stripper")>> <<set _bouncers = setup.getNPCsByJob("Bouncer")>> <<set _npcsHere = _strippers.concat(_bouncers)>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #9D00FF; margin-top: 30px;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9D00FF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9D00FF; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #9D00FF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #9D00FF; margin-top: 30px;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The club is quiet right now. No one is available. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #ff1493; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set $lastLocation = "Casino">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">🎰 Silver Marlin</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d4af37 0%, #8b7355 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> Neon lights flash in rhythmic patterns across walls lined with slot machines and gaming tables. The constant chiming of wins mixes with the shuffle of cards and the roll of dice. Cocktail servers weave through crowds of hopeful gamblers while security watches from discrete corners. The air is thick with cigarette smoke and expensive cologne. </p> </div> <!-- Casino Activities Section --> <h2 style="color: #ffd700;">Casino Games</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 30px;"> <!-- Slot Machines --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🎰 Slot Machines</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">Work in Progress</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Roulette --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🎡 Roulette</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">Work in Progress</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Coming Soon</div> </div> </div> <!-- NPCs Section --> <<set _casinoNPCs = []>> <<for _npc range $npcs>> <<set _hasCasinoJob = false>> <<if typeof _npc.jobs === "string">> <<if _npc.jobs === "Cocktail Waitress" || _npc.jobs === "Security Guard">> <<set _hasCasinoJob = true>> <</if>> <<elseif Array.isArray(_npc.jobs)>> <<if _npc.jobs.includes("Cocktail Waitress") || _npc.jobs.includes("Security Guard")>> <<set _hasCasinoJob = true>> <</if>> <</if>> <<if _hasCasinoJob>> <<run _casinoNPCs.push(_npc)>> <</if>> <</for>> <<if _casinoNPCs.length > 0>> <h2 style="color: #ffd700;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 15px; margin: 0 0 15px 0; font-style: italic;"> Casino staff working the floor... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _casinoNPCs>> <<capture _npc>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 5px 0;"> <<if typeof _npc.jobs === "string">> <em>_npc.jobs</em> <<else>> <<set _displayJob = _npc.jobs.includes("Cocktail Waitress") ? "Cocktail Waitress" : "Security Guard">> <em>_displayJob</em> <</if>> </p> <<link "<div style='background: #ffd700; color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #ffd700;">Casino Staff</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #666; font-size: 15px; margin: 0; font-style: italic;"> No staff members are currently available. </p> </div> <</if>> <br><br> <br><br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<workShift>> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <<set _alreadyTalkedToday = ($dailyConversations[_npc.name] !== undefined && $dailyConversations[_npc.name] >= $dayNumber)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Page Header --> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 20px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0; font-size: 28px; text-align: center;">💬 Conversation with <<= _npc.name>></h1> </div> <!-- Player's Dialogue --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px;">You say...</h3> <div style="color: #ccc; font-size: 17px; line-height: 1.8; font-style: italic;"> "<<print setup.getPlayerDialogue($currentTopic)>>" </div> </div> <!-- NPC's Response --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px;"><<= _npc.name>> responds...</h3> <div style="color: #ccc; font-size: 17px; line-height: 1.8; font-style: italic;"> <<set _relationship = $relationships[_npc.name] || {level: 1, points: 0}>> <<set _relLevel = _relationship.level>> "<<print setup.getNPCResponse(_npc, $currentTopic, _relLevel)>>" </div> </div> <!-- Relationship Change - ONLY if not already talked today --> <<if !_alreadyTalkedToday>> <<set _pointsChange = setup.calculateTalkRelationshipChange(_npc, $currentTopic, _relLevel)>> <<if _pointsChange !== 0>> <<run setup.addRelationshipPoints(_npc.name, _pointsChange)>> <<set $dailyConversations[_npc.name] = $dayNumber>> <div style="background: <<if _pointsChange > 0>>#2a4a2a<<else>>#4a2a2a<</if>>; border: 2px solid <<if _pointsChange > 0>>#51cf66<<else>>#ff6b6b<</if>>; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: <<if _pointsChange > 0>>#51cf66<<else>>#ff6b6b<</if>>; font-weight: bold; font-size: 16px;"> <<if _pointsChange > 0>> 💚 Relationship improved! (+<<= _pointsChange>> points) <<else>> 💔 Relationship worsened! (<<= _pointsChange>> points) <</if>> </span> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Conversation</div>">> <<goto "NPCTalk">> <</link>> </div> </div> <</nobr>>
<<silently>> <<if !$showScrollbar>> <<run $('<style id="scrollbar-toggle">::-webkit-scrollbar { display: none; } body { -ms-overflow-style: none; scrollbar-width: none; }</style>').appendTo('head')>> <<else>> <<run $('style#scrollbar-toggle').remove()>> <</if>> <</silently>>
<<nobr>> <<set $lastLocation = "VIPLounge">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">🔒 VIP Lounge</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0;"> Private rooms with soundproof walls and exclusive service. Only the most privileged patrons are allowed access to this area. Ambient music plays softly while elegant decor creates an intimate atmosphere. </p> </div> <h2 style="color: #9D00FF;">This area is currently under development.</h2> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #9D00FF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Strip Club</div>">> <<goto "StripClub">> <</link>> </div> </div> <</nobr>>
:: DayAdvancement <<widget "advanceDay">> <<set $dayNumber += 1>> <<set $dayCount = $dayNumber>> /* Advance day of week */ <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<set _nextDayIndex = (_currentDayIndex + 1) % 7>> <<set $dayOfWeek = $dayOrder[_nextDayIndex]>> /* Check if new week */ <<if $dayOfWeek === "Monday">> <<set $weekNumber += 1>> <</if>> /* Reset daily trades */ <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> /* Check if hair styling has expired */ <<if $hairStyleExpiry && $dayNumber >= $hairStyleExpiry>> <<set $appearance.hairStyle = "messy">> <<set $hairStyleExpiry = null>> <</if>> // Reset secretary work hours if (v.secretaryHoursWorkedToday) { v.secretaryHoursWorkedToday = 0; } /* Reset time to morning */ <<set $timeInMinutes = 480>> /* Reset daily conversations */ <<set $dailyConversations = {}>> <</widget>>
<<nobr>> <<set $lastLocation = "StudioApartment">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">🏠 Your Studio Apartment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #6c757d 0%, #495057 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #6c757d;"> <p style="color: white; font-size: 18px; margin: 0;"> A cramped but functional studio apartment. The single room serves as bedroom, living room, and kitchenette all in one. The furniture is basic and worn, but it's yours. A small window overlooks the alley below. At least you're not on the streets. </p> </div> <h2 style="color: #51cf66;">Main Room</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bed - Sleep Option --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🛏️ Bed</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Get some rest and sleep. You can sleep up to 12 hours.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Sleep</div>">> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #51cf66; margin-top: 0;">😴 How long do you want to sleep?</h2> <p style="color: #ccc; margin-bottom: 15px;">Enter hours (max 12):</p> <input type="number" id="rest-time-input" min="1" max="12" value="8" style="width: 100px; padding: 8px; font-size: 16px; text-align: center; border: 2px solid #51cf66; border-radius: 5px; background: #2a2a2a; color: white;"> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 12 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<run advanceTime(_restHours * 60)>> <<set $appearance.hairStyle = "messy">> <<run Dialog.close()>> <<goto "StudioApartment">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Kitchenette --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🍳 Kitchenette</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A small cooking area with basic appliances.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- TV Area --> <<if $hasTV>> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">📺 Television</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Watch TV and relax.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Watch TV</div>">> <<goto "WatchTV">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">📺 TV Stand</h3> <p style="font-size: 14px; color: #888; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An empty TV stand. You could buy a television to place here.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No TV</div> </div> <</if>> <!-- Laptop Area --> <<if $hasLaptop>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💻 Laptop</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Use your laptop for various activities.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Laptop</div>">> <<goto "UseLaptop">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">💻 Desk</h3> <p style="font-size: 14px; color: #888; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An empty desk. You could buy a laptop to place here.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No Laptop</div> </div> <</if>> </div> <h2 style="color: #51cf66;">Other Rooms</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bathroom --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Bathroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A small bathroom with shower, toilet, mirror, and storage cabinet.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bathroom</div>">> <<goto "StudioBathroom">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave Apartment</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BasicApartment">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">🏠 Your Basic Apartment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> A decent one-bedroom apartment with separate living and sleeping areas. The furniture is mass-produced but serviceable. A small kitchen lets you cook your own meals, and the bathroom has a proper shower. Windows provide natural light and a view of the street below. It's not fancy, but it's comfortable enough. </p> </div> <h2 style="color: #51cf66;">Apartment Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Rest Option --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">😴 Rest</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 15px;">Sleep and recover. Basic apartments allow up to 8 hours of rest.</p> <div style="text-align: center;"> <<link "Rest">> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #17a2b8; margin-top: 0;">How long do you want to rest?</h2> <p style="color: #ccc; margin-bottom: 15px;">Enter hours (max 8):</p> <input type="number" id="rest-time-input" min="1" max="8" value="4" style="width: 100px; padding: 8px; font-size: 16px; text-align: center; border: 2px solid #17a2b8; border-radius: 5px; background: #2a2a2a; color: white;"> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #17a2b8; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 8 || Number.isNaN(_restHours)>> <<set _restHours = 4>> <</if>> <<set $timeInMinutes += (_restHours * 60)>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < $dayOrder.length - 1>> <<set $dayOfWeek = $dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = $dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> /* Check if hair styling has expired */ <<if $hairStyleExpiry && $dayNumber >= $hairStyleExpiry>> <<set $appearance.hairStyle = "messy">> <<set $hairStyleExpiry = null>> <</if>> <</if>> <<run Dialog.close()>> <<goto "BasicApartment">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> </div> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "FancyApartment">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffc107; text-align: center;">✨ Your Fancy Apartment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ffc107 0%, #ff9800 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffc107;"> <p style="color: white; font-size: 18px; margin: 0;"> A spacious two-bedroom apartment with modern furnishings and upscale amenities. Hardwood floors gleam under recessed lighting. The kitchen features stainless steel appliances and granite countertops. Large windows offer excellent city views. A comfortable couch faces a wall-mounted flat screen TV. The master bedroom has an en-suite bathroom with a luxurious shower. This is proper middle-class living. </p> </div> <h2 style="color: #ffc107;">Apartment Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Rest Option --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">😴 Rest</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 15px;">Sleep and recover. Fancy apartments allow up to 12 hours of rest.</p> <div style="text-align: center;"> <<link "Rest">> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #ffc107; margin-top: 0;">How long do you want to rest?</h2> <p style="color: #ccc; margin-bottom: 15px;">Enter hours (max 12):</p> <input type="number" id="rest-time-input" min="1" max="12" value="8" style="width: 100px; padding: 8px; font-size: 16px; text-align: center; border: 2px solid #ffc107; border-radius: 5px; background: #2a2a2a; color: white;"> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #ffc107; color: #000; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 12 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<set $timeInMinutes += (_restHours * 60)>> <<while $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < $dayOrder.length - 1>> <<set $dayOfWeek = $dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = $dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> /* Check if hair styling has expired */ <<if $hairStyleExpiry && $dayNumber >= $hairStyleExpiry>> <<set $appearance.hairStyle = "messy">> <<set $hairStyleExpiry = null>> <</if>> <</while>> <<run Dialog.close()>> <<goto "FancyApartment">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> </div> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PenthouseApartment">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">👑 Your Penthouse</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> An opulent penthouse suite occupying the entire top floor. Floor-to-ceiling windows provide breathtaking panoramic views of Sunfish City. Designer furniture, original artwork, and imported materials throughout. The gourmet kitchen could host a cooking show. Multiple bedrooms each with their own luxurious bathrooms. A private balcony with hot tub overlooks the city lights. This is how the elite live. </p> </div> <h2 style="color: #9b59b6;">Penthouse Amenities</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Rest Option --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">😴 Rest</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 15px;">Sleep and recover in luxury. Penthouses allow rest for any duration up to 24 hours.</p> <div style="text-align: center;"> <<link "Rest">> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #9b59b6; margin-top: 0;">How long do you want to rest?</h2> <p style="color: #ccc; margin-bottom: 15px;">Enter hours (max 24):</p> <input type="number" id="rest-time-input" min="1" max="24" value="8" style="width: 100px; padding: 8px; font-size: 16px; text-align: center; border: 2px solid #9b59b6; border-radius: 5px; background: #2a2a2a; color: white;"> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #9b59b6; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 24 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<set $timeInMinutes += (_restHours * 60)>> <<while $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < $dayOrder.length - 1>> <<set $dayOfWeek = $dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = $dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> /* Check if hair styling has expired */ <<if $hairStyleExpiry && $dayNumber >= $hairStyleExpiry>> <<set $appearance.hairStyle = "messy">> <<set $hairStyleExpiry = null>> <</if>> <</while>> <<run Dialog.close()>> <<goto "PenthouseApartment">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> </div> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Check for trait gain (5% chance if worked 5+ hours) --> <<set _gainedWorkTrait = false>> <<set _gainedWorkTraitName = "">> <<if $lastWorkHours >= 5 && random(1, 100) <= 5>> <<set _jobTraitPools = { "Dock Worker": [ {name: "Athletic Build", type: "physical"}, {name: "Fit", type: "physical"}, {name: "Muscular", type: "physical"}, {name: "Relaxed", type: "mental"}, {name: "Strong", type: "physical"}, {name: "Sturdy", type: "physical"}, {name: "Forklift Certified", type: "skill"} ], "Tech Store Clerk": [ {name: "Deep Thinker", type: "physical"}, {name: "Analytical", type: "mental"}, {name: "Direct", type: "mental"}, {name: "Focused", type: "mental"}, {name: "Intelligent", type: "mental"}, {name: "Resourceful", type: "mental"}, {name: "Customer Service", type: "skill"}, {name: "Inventory Management", type: "skill"}, {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Tech-Savvy", type: "skill"} ], "Adult Store Clerk": [ {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Perceptive", type: "mental"}, {name: "Charming", type: "mental"}, {name: "Chill", type: "mental"}, {name: "Curious", type: "mental"}, {name: "Flirty", type: "mental"}, {name: "Nonchalant", type: "mental"}, {name: "Sly", type: "mental"} ], "Eccentric Shop Worker": [ {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Perceptive", type: "mental"}, {name: "Goth", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Introverted", type: "mental"} ] }>> <!-- Check if this job has a trait pool --> <<if _jobTraitPools[$lastWorkJob]>> <<set _availableWorkTraits = []>> <!-- Filter out traits the player already has --> <<for _i = 0; _i < _jobTraitPools[$lastWorkJob].length; _i++>> <<set _traitData = _jobTraitPools[$lastWorkJob][_i]>> <<set _hasIt = false>> <<if _traitData.type === "physical" && $physicalTraits.includes(_traitData.name)>> <<set _hasIt = true>> <<elseif _traitData.type === "mental" && $mentalTraits.includes(_traitData.name)>> <<set _hasIt = true>> <<elseif _traitData.type === "skill" && $skills.includes(_traitData.name)>> <<set _hasIt = true>> <</if>> <<if !_hasIt>> <<set _availableWorkTraits.push(_traitData)>> <</if>> <</for>> <!-- If there are traits available to gain, pick one randomly --> <<if _availableWorkTraits.length > 0>> <<set _selectedWorkTrait = _availableWorkTraits.random()>> <<set _gainedWorkTraitName = _selectedWorkTrait.name>> <<if _selectedWorkTrait.type === "skill">> <<set $skills.push(_gainedWorkTraitName)>> <<elseif _selectedWorkTrait.type === "mental">> <<set $mentalTraits.push(_gainedWorkTraitName)>> <<elseif _selectedWorkTrait.type === "physical">> <<set $physicalTraits.push(_gainedWorkTraitName)>> <</if>> <<set _gainedWorkTrait = true>> <</if>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">✅ Shift Complete!</h1> <p style="color: white; margin: 0; font-size: 18px;">You've finished your shift as a <<print $lastWorkJob>></p> </div> <!-- Work-Related Trait Gain Notification --> <<if _gainedWorkTrait>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 25px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(155, 89, 182, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">✨ Work Experience Gained!</h2> <p style="color: #ffd; font-size: 18px; margin: 0;"> Your hard work has paid off!<br> You gained: <strong style="color: #ffd43b;"><<print _gainedWorkTraitName>></strong> </p> </div> <</if>> <<if $lastWorkTraitChanges && $lastWorkTraitChanges.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">⭐ Personal Changes</h2> <<for _i, _change range $lastWorkTraitChanges>> <<if _change.type === "gain">> <div style="background: #1a3a1a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #28a745;"> <p style="color: #28a745; margin: 0; font-size: 16px; font-weight: bold;">✨ Gained New Trait: _change.trait</p> </div> <<elseif _change.type === "upgrade">> <div style="background: #1a1a3a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-size: 16px; font-weight: bold;">⬆️ Upgraded: _change.oldTrait → _change.newTrait</p> </div> <<elseif _change.type === "remove">> <div style="background: #3a1a1a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #dc3545;"> <p style="color: #dc3545; margin: 0; font-size: 16px; font-weight: bold;">❌ Removed: _change.trait</p> </div> <<elseif _change.type === "replace">> <div style="background: #3a1a3a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #9b59b6;"> <p style="color: #9b59b6; margin: 0; font-size: 16px; font-weight: bold;">🔄 Replaced: _change.oldTrait → _change.newTrait</p> </div> <</if>> <</for>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #28a745; margin-top: 0; font-size: 24px; border-bottom: 3px solid #28a745; padding-bottom: 10px;">💰 Earnings Summary</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-top: 15px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 15px;"> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hours Worked:</p> <p style="color: #fff; margin: 0; font-size: 24px; font-weight: bold;"><<print $lastWorkHours>> hours</p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Money Earned:</p> <p style="color: #28a745; margin: 0; font-size: 24px; font-weight: bold;"><<print setup.formatMoney($lastWorkEarnings)>></p> </div> </div> <hr style="border: 0; border-top: 1px solid #666; margin: 15px 0;"> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Total Money:</p> <p style="color: #51cf66; margin: 0; font-size: 28px; font-weight: bold;"><<print setup.formatMoney($money)>></p> </div> </div> <div style="background: #3a3020; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-top: 15px;"> <p style="color: #ffc107; margin: 0; text-align: center; font-size: 14px;"> ⏰ <strong>New Time:</strong> <<= getTimeString()>> - $dayOfWeek </p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #17a2b8;"> <p style="color: #17a2b8; margin: 0; text-align: center; font-size: 14px;"> 📊 <strong>Hours Worked Today:</strong> <<print $hoursWorkedToday>> / 8 </p> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0; font-size: 16px; line-height: 1.6;"> You spent the last <<print $lastWorkHours>> hours working hard at your job. The shift was tiring but the pay makes it worthwhile. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>">> <<goto $lastWorkLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StudioBathroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">🚿 Bathroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> A small but functional bathroom. White tiles line the walls, and everything is kept reasonably clean. The mirror above the sink reflects your image back at you. </p> </div> <h2 style="color: #3498db;">Bathroom Features</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Shower --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Shower</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A basic shower with hot water. Clean yourself up.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Toilet --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">🚽 Toilet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A standard toilet. Nothing special.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Mirror --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🪞 Mirror</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Look at yourself and check your appearance.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Look in Mirror</div>">> <<goto "MirrorView">> <</link>> </div> <!-- Storage Cabinet --> <div style="border: 3px solid #8e44ad; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #8e44ad; margin: 0 0 10px 0;">🗄️ Storage Cabinet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A small cabinet for storing bathroom items and supplies.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Main Room</div>">> <<goto "StudioApartment">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "MirrorView">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #f39c12; text-align: center;">🪞 Looking in the Mirror</h1> <div style="padding: 20px; background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #f39c12;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> You gaze at your reflection... </p> </div> <!-- Description Box --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<set _genderWord = "">> <<set _pronounNoun = "">> <<if $bodyParts.gender === "female">> <<set _genderWord = "feminine">> <<set _pronounNoun = setup.gender.pronouns().noun>> <<elseif $bodyParts.gender === "male">> <<set _genderWord = "masculine">> <<set _pronounNoun = setup.gender.pronouns().noun>> <<else>> <<set _genderWord = "androgynous">> <<set _pronounNoun = setup.gender.pronouns().noun>> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You look and see <<a _genderWord>> <<print _pronounNoun>> staring back at you in the mirror. </p> <<set _chestDescription = "">> <<if $bodyParts.chest === "flat masculine">> <<set _chestDescription = "You have a flat, masculine chest.">> <<elseif $bodyParts.chest === "flat">> <<set _chestDescription = "You have flat breasts.">> <<elseif $bodyParts.chest === "small">> <<set _chestDescription = "You have small breasts.">> <<elseif $bodyParts.chest === "medium">> <<set _chestDescription = "You have medium-sized breasts.">> <<elseif $bodyParts.chest === "large">> <<set _chestDescription = "You have large breasts.">> <<elseif $bodyParts.chest === "huge">> <<set _chestDescription = "You have huge breasts.">> <<elseif $bodyParts.chest === "giant">> <<set _chestDescription = "You have giant breasts.">> <<else>> <<set _chestDescription = "You have a chest.">> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print _chestDescription>> </p> </div> <!-- Image Display Section --> <h2 style="color: #f39c12; text-align: center;">Your Reflection</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Face Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #667eea; margin: 0 0 10px 0; text-align: center;">Your Face</h3> <<set _faceImage = setup.getPlayerFaceImage()>> <div style="text-align: center;"> <img @src="_faceImage" style="max-width: 100%; height: auto; border-radius: 8px;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #1a1a1a; border-radius: 8px; color: #999; font-style: italic;"> Image not found </div> </div> </div> <!-- Chest Image --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0; text-align: center;">Your Chest</h3> <<set _chestImage = setup.getPlayerChestImage()>> <div style="text-align: center;"> <img @src="_chestImage" style="max-width: 100%; height: auto; border-radius: 8px;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #1a1a1a; border-radius: 8px; color: #999; font-style: italic;"> Image not found </div> </div> </div> </div> <!-- Additional Info Box --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin: 0 0 15px 0;">Additional Details</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Skin Tone:</p> <p style="color: #fff; margin: 0; font-size: 16px; text-transform: capitalize;"><<print $appearance.skinTone>></p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hair Color:</p> <p style="color: #fff; margin: 0; font-size: 16px;"><<print $appearance.hairColor>></p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hair Style:</p> <p style="color: #fff; margin: 0; font-size: 16px; text-transform: capitalize;"><<print $appearance.hairStyle>></p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hair Length:</p> <p style="color: #fff; margin: 0; font-size: 16px; text-transform: capitalize;"><<print $appearance.hairLength>></p> </div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Bathroom</div>">> <<goto "StudioBathroom">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">😴 Restless Sleep</h1> <div style="padding: 20px; background: linear-gradient(135deg, #434343 0%, #000000 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 18px; margin: 0;"> You manage to get some fitful sleep behind the trash bags. The smell is unbearable and every sound makes you jolt awake, but at least you got some rest. Your body aches from the hard ground, but you're safe... for now. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Wake Up</div>">> <<goto "Alleyway">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">😱 Robbed!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #c92a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0;"> You wake up suddenly to find someone rifling through your pockets! Before you can react, they sprint off into the darkness with half your money! </p> <p style="color: white; font-size: 16px; margin: 0; font-weight: bold;"> You lost half your money! </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; font-size: 15px; margin: 0; text-align: center;"> You curse yourself for sleeping in such a dangerous place. The streets are ruthless to those who let their guard down. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Get Up</div>">> <<goto "Alleyway">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Random client gender --> <<set _clientGender = either("male", "female")>> <<set _playerGender = $bodyParts.gender>> <!-- Calculate earnings --> <<set _basePay = random(50, 125)>> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _bonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait) || $skills.includes(_trait)>> <<set _bonusMoney += 15>> <</if>> <</for>> <<set _brothelNegativeTraits = ["Ugly", "Scarred", "Plain", "Blemished", "Overweight", "Underweight", "Stubborn", "Paranoid", "Jealous", "Dull", "Immature"]>> <<set _penaltyPercent = 0>> <<for _trait range _brothelNegativeTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait)>> <<set _penaltyPercent += 10>> <</if>> <</for>> <!-- Calculate stat penalty (charisma requirement: 35) --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _statMultiplier = 1.0>> <<if _totalCharisma < 35>> <<set _statMultiplier = _totalCharisma / 35>> <<if _statMultiplier < 0>> <<set _statMultiplier = 0>> <</if>> <</if>> <!-- Apply all multipliers --> <<set _penaltyMultiplier = 1.0 - (_penaltyPercent / 100)>> <<set _totalPay = Math.round(_basePay * _statMultiplier * _penaltyMultiplier) + _bonusMoney>> <<set $money += _totalPay>> <!-- Increment counters --> <<set $brothelClients += 1>> <<set $brothelClientsToday += 1>> <!-- Handle trait gain (15% chance) --> <<set _gainedTrait = "">> <<set _traitGained = false>> <<if random(1, 100) <= 15>> <<set _possibleGains = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _availableGains = []>> <<for _gain range _possibleGains>> <<if !$mentalTraits.includes(_gain) && !$physicalTraits.includes(_gain) && !$skills.includes(_gain)>> <<run _availableGains.push(_gain)>> <</if>> <</for>> <<if _availableGains.length > 0>> <<set _gainedTrait = _availableGains[random(0, _availableGains.length - 1)]>> <<set _traitGained = true>> <<if _gainedTrait === "Dominant" || _gainedTrait === "Submissive">> <<if _gainedTrait === "Dominant">> <<set $mentalTraits.delete("Submissive")>> <<else>> <<set $mentalTraits.delete("Dominant")>> <</if>> <<set $mentalTraits.push(_gainedTrait)>> <<elseif _gainedTrait === "Dancing" || _gainedTrait === "High Heels Proficient" || _gainedTrait === "Sexually Skilled" || _gainedTrait === "Serving" || _gainedTrait === "Persuasion">> <<set $skills.push(_gainedTrait)>> <<else>> <<set $mentalTraits.push(_gainedTrait)>> <</if>> <</if>> <</if>> <!-- Advance time --> <<advancetime 60>> <!-- Select random scene --> <<set _sceneNumber = random(1, 5)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Client Session</h1> <<if _clientGender === "male" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A nervous man in rumpled work clothes enters, clearly inexperienced. You keep things simple and professional, guiding him through the basics without making him feel judged. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A young man in casual clothes looks uncertain. You take the lead, making him comfortable as you provide straightforward service. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An older gentleman in worn but clean clothes requests something basic. You accommodate his needs with practiced ease. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A shy client barely makes eye contact. You work efficiently, making the experience as smooth as possible for both of you. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A regular in cheap cologne comes in for a quick session. You know exactly what he likes by now and deliver without fuss. </p> </div> <</if>> <</if>> <<if _clientGender === "male" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A shy man in a modest suit fumbles with his wallet. You put him at ease with gentle touches and reassuring words, making his first time memorable. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A young professional looks uncertain. You guide him gently, making sure he enjoys every moment of the experience. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An older man with calloused hands requests traditional service. You provide exactly what he needs with developing skill. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A nervous client barely speaks. You take control gently, leading him through the experience with patient care. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A regular customer returns, smelling of cigarettes and cheap aftershave. You greet him warmly and deliver the familiar service he craves. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A tired woman in office attire arrives after a long shift. You help her unwind with patient attention, learning what she needs. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A woman in simple clothes knows what she wants. You provide exactly what she's paying for without unnecessary flourish. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An older woman seeks comfort and attention. You give her the care and intimacy she deserves. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A first-time client seems nervous, fidgeting with her purse. You make her comfortable and ensure she enjoys the experience. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A regular returns wearing her work uniform. You've learned exactly how to please her over these sessions. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A stressed woman still wearing her name tag sits nervously. You make her comfortable, slowly helping her relax and enjoy the experience. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A confident woman in casual wear knows what she wants. You deliver with enthusiasm, learning as you go. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An older woman seeks companionship and pleasure. You provide both generously, adapting to her pace. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A curious first-timer seems hesitant. You guide her through the experience with patience and gentle encouragement. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A regular returns, eager for your attention. You know just how to satisfy her by now. </p> </div> <</if>> <</if>> <!-- Earnings Display --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💰 Session Complete</h2> <p style="color: #ccc; font-size: 16px; margin: 0 0 10px 0;">Base Payment: $<<print _basePay>></p> <<if _statMultiplier < 1.0>> <<set _statPenaltyPercent = Math.round((1.0 - _statMultiplier) * 100)>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Charisma Penalty: -<<print _statPenaltyPercent>>% (<<print _totalCharisma>>/35)</p> <</if>> <<if _penaltyPercent > 0>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Negative Traits Penalty: -<<print _penaltyPercent>>%</p> <</if>> <<if _bonusMoney > 0>> <p style="color: #ffc107; font-size: 16px; margin: 0 0 10px 0;">Skill Bonus: +$<<print _bonusMoney>></p> <</if>> <p style="color: #51cf66; font-size: 20px; margin: 0; font-weight: bold;">Total Earned: $<<print _totalPay>></p> </div> <!-- Trait Gained Notification --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0; text-align: center;">✨ NEW TRAIT ACQUIRED! ✨</h2> <p style="color: #9b59b6; font-size: 18px; margin: 10px 0 0 0; text-align: center; font-weight: bold;">_gainedTrait</p> <p style="color: #ccc; font-size: 14px; margin: 5px 0 0 0; text-align: center;">Your experiences have shaped you.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #007FFF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Lounge</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Random client gender --> <<set _clientGender = either("male", "female")>> <<set _playerGender = $bodyParts.gender>> <!-- Calculate earnings --> <<set _basePay = random(100, 325)>> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _bonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait) || $skills.includes(_trait)>> <<set _bonusMoney += 15>> <</if>> <</for>> <<set _brothelNegativeTraits = ["Ugly", "Scarred", "Plain", "Blemished", "Overweight", "Underweight", "Stubborn", "Paranoid", "Jealous", "Dull", "Immature"]>> <<set _penaltyPercent = 0>> <<for _trait range _brothelNegativeTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait)>> <<set _penaltyPercent += 10>> <</if>> <</for>> <!-- Calculate stat penalty (charisma requirement: 35) --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _statMultiplier = 1.0>> <<if _totalCharisma < 35>> <<set _statMultiplier = _totalCharisma / 35>> <<if _statMultiplier < 0>> <<set _statMultiplier = 0>> <</if>> <</if>> <!-- Apply all multipliers --> <<set _penaltyMultiplier = 1.0 - (_penaltyPercent / 100)>> <<set _totalPay = Math.round(_basePay * _statMultiplier * _penaltyMultiplier) + _bonusMoney>> <<set $money += _totalPay>> <!-- Increment counters --> <<set $brothelClients += 1>> <<set $brothelClientsToday += 1>> <!-- Handle trait gain (15% chance) --> <<set _gainedTrait = "">> <<set _traitGained = false>> <<if random(1, 100) <= 15>> <<set _possibleGains = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _availableGains = []>> <<for _gain range _possibleGains>> <<if !$mentalTraits.includes(_gain) && !$physicalTraits.includes(_gain) && !$skills.includes(_gain)>> <<run _availableGains.push(_gain)>> <</if>> <</for>> <<if _availableGains.length > 0>> <<set _gainedTrait = _availableGains[random(0, _availableGains.length - 1)]>> <<set _traitGained = true>> <<if _gainedTrait === "Dominant" || _gainedTrait === "Submissive">> <<if _gainedTrait === "Dominant">> <<set $mentalTraits.delete("Submissive")>> <<else>> <<set $mentalTraits.delete("Dominant")>> <</if>> <<set $mentalTraits.push(_gainedTrait)>> <<elseif _gainedTrait === "Dancing" || _gainedTrait === "High Heels Proficient" || _gainedTrait === "Sexually Skilled" || _gainedTrait === "Serving" || _gainedTrait === "Persuasion">> <<set $skills.push(_gainedTrait)>> <<else>> <<set $mentalTraits.push(_gainedTrait)>> <</if>> <</if>> <</if>> <!-- Advance time --> <<advancetime 60>> <!-- Select random scene --> <<set _sceneNumber = random(1, 5)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Client Session</h1> <<if _clientGender === "male" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-dressed professional in designer clothes arrives with specific requests. You meet his expectations with growing confidence and skill. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A demanding client in polished shoes pushes your limits. You rise to the challenge, impressing him with your developing technique. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A man wearing a nice watch wants the full experience. You provide professional service with added flair. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A repeat customer specifically asks for you. Your reputation is growing, and it shows in his satisfaction. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-groomed man in business casual wants something memorable. You show him why clients are starting to ask for you by name. </p> </div> <</if>> <</if>> <<if _clientGender === "male" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A confident man in expensive casual wear knows what he wants. You deliver with practiced technique, earning a generous tip. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A demanding client tests your abilities. You prove yourself capable and eager to please, leaving him impressed. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A man in designer cologne expects excellence. You deliver professional intimacy with growing expertise. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A repeat customer becomes a regular. He clearly appreciates your improving technique. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-off client wants something special. You ensure he'll remember this experience and come back for more. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A stylish woman with expensive jewelry wants more than conversation. You provide attentive service, noting her preferences for next time. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A client in designer clothing requests specific roleplay. Your acting skills are improving with each session. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-dressed woman expects quality service. You deliver professional intimacy with added skill. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A repeat customer becomes your regular. She clearly appreciates your growing expertise. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A confident woman in heels wants to relax. You ensure she leaves satisfied and eager to book again. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A poised woman in tailored clothing requests something special. Your developing skills leave her satisfied and eager to return. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A client in expensive perfume wants intimate roleplay. You lose yourself in the performance, impressing her. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-off woman expects perfection. You deliver with practiced sensuality and growing confidence. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A repeat customer becomes your regular. She can't get enough of your improving technique. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A stylish woman wants the full experience. You show her pleasure she won't forget, earning her loyalty. </p> </div> <</if>> <</if>> <!-- Earnings Display --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💰 Session Complete</h2> <p style="color: #ccc; font-size: 16px; margin: 0 0 10px 0;">Base Payment: $<<print _basePay>></p> <<if _statMultiplier < 1.0>> <<set _statPenaltyPercent = Math.round((1.0 - _statMultiplier) * 100)>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Charisma Penalty: -<<print _statPenaltyPercent>>% (<<print _totalCharisma>>/35)</p> <</if>> <<if _penaltyPercent > 0>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Negative Traits Penalty: -<<print _penaltyPercent>>%</p> <</if>> <<if _bonusMoney > 0>> <p style="color: #ffc107; font-size: 16px; margin: 0 0 10px 0;">Skill Bonus: +$<<print _bonusMoney>></p> <</if>> <p style="color: #51cf66; font-size: 20px; margin: 0; font-weight: bold;">Total Earned: $<<print _totalPay>></p> </div> <!-- Trait Gained Notification --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0; text-align: center;">✨ NEW TRAIT ACQUIRED! ✨</h2> <p style="color: #9b59b6; font-size: 18px; margin: 10px 0 0 0; text-align: center; font-weight: bold;">_gainedTrait</p> <p style="color: #ccc; font-size: 14px; margin: 5px 0 0 0; text-align: center;">Your experiences have shaped you.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #007FFF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Lounge</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Random client gender --> <<set _clientGender = either("male", "female")>> <<set _playerGender = $bodyParts.gender>> <!-- Calculate earnings --> <<set _basePay = random(125, 750)>> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _bonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait) || $skills.includes(_trait)>> <<set _bonusMoney += 15>> <</if>> <</for>> <<set _brothelNegativeTraits = ["Ugly", "Scarred", "Plain", "Blemished", "Overweight", "Underweight", "Stubborn", "Paranoid", "Jealous", "Dull", "Immature"]>> <<set _penaltyPercent = 0>> <<for _trait range _brothelNegativeTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait)>> <<set _penaltyPercent += 10>> <</if>> <</for>> <!-- Calculate stat penalty (charisma requirement: 35) --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _statMultiplier = 1.0>> <<if _totalCharisma < 35>> <<set _statMultiplier = _totalCharisma / 35>> <<if _statMultiplier < 0>> <<set _statMultiplier = 0>> <</if>> <</if>> <!-- Apply all multipliers --> <<set _penaltyMultiplier = 1.0 - (_penaltyPercent / 100)>> <<set _totalPay = Math.round(_basePay * _statMultiplier * _penaltyMultiplier) + _bonusMoney>> <<set $money += _totalPay>> <!-- Increment counters --> <<set $brothelClients += 1>> <<set $brothelClientsToday += 1>> <!-- Handle trait gain (15% chance) --> <<set _gainedTrait = "">> <<set _traitGained = false>> <<if random(1, 100) <= 15>> <<set _possibleGains = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _availableGains = []>> <<for _gain range _possibleGains>> <<if !$mentalTraits.includes(_gain) && !$physicalTraits.includes(_gain) && !$skills.includes(_gain)>> <<run _availableGains.push(_gain)>> <</if>> <</for>> <<if _availableGains.length > 0>> <<set _gainedTrait = _availableGains[random(0, _availableGains.length - 1)]>> <<set _traitGained = true>> <<if _gainedTrait === "Dominant" || _gainedTrait === "Submissive">> <<if _gainedTrait === "Dominant">> <<set $mentalTraits.delete("Submissive")>> <<else>> <<set $mentalTraits.delete("Dominant")>> <</if>> <<set $mentalTraits.push(_gainedTrait)>> <<elseif _gainedTrait === "Dancing" || _gainedTrait === "High Heels Proficient" || _gainedTrait === "Sexually Skilled" || _gainedTrait === "Serving" || _gainedTrait === "Persuasion">> <<set $skills.push(_gainedTrait)>> <<else>> <<set $mentalTraits.push(_gainedTrait)>> <</if>> <</if>> <</if>> <!-- Advance time --> <<advancetime 60>> <!-- Select random scene --> <<set _sceneNumber = random(1, 5)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Client Session</h1> <<if _clientGender === "male" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A man steps out of a luxury car, gold watch gleaming. He's clearly used to the finer things, and you've learned how to deliver them. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A client in tailored clothing arrives with a thick wad of cash. Your reputation has spread, and he wants an extended session. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone well-connected specifically requested you. His expensive tastes are met with your mastered technique. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A demanding client in designer everything tests your limits. You exceed every expectation with skill and confidence. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy regular books you for the night. Your mastery of the craft is evident in every touch. </p> </div> <</if>> <</if>> <<if _clientGender === "male" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A client in an Italian suit arrives with champagne. Your reputation has spread, and he specifically requested you by name. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-off client wants an extended private session. You provide unforgettable pleasure that justifies the premium rate. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone influential arrives in an expensive car. You give him an experience worthy of his status. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A demanding client pushes your abilities. You prove why you're becoming one of the establishment's stars. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy regular reserves you for the entire evening. Your expertise speaks for itself. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: #e91e63; margin: 0;"> A woman dripping in designer labels wants to be in control. You play your part perfectly, understanding the psychology of power. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-connected woman wants elaborate roleplay. Your performance is flawless, and she tips generously. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone with expensive tastes seeks your specific talents. Your reputation has spread through exclusive circles. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A demanding client gets more than she paid for. You're at the peak of your abilities. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy woman becomes addicted to your services. You've perfected your craft. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A stunning woman in haute couture expects excellence. You've mastered your craft well enough to exceed even her high standards. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-off client wants elaborate fantasy fulfillment. You bring her deepest desires to life with practiced skill. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone influential seeks you specifically. Your name is whispered in exclusive circles. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A demanding client is left breathless. You've become irreplaceable to her. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy woman books you exclusively. You've mastered every technique she craves. </p> </div> <</if>> <</if>> <!-- Earnings Display --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💰 Session Complete</h2> <p style="color: #ccc; font-size: 16px; margin: 0 0 10px 0;">Base Payment: $<<print _basePay>></p> <<if _statMultiplier < 1.0>> <<set _statPenaltyPercent = Math.round((1.0 - _statMultiplier) * 100)>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Charisma Penalty: -<<print _statPenaltyPercent>>% (<<print _totalCharisma>>/35)</p> <</if>> <<if _penaltyPercent > 0>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Negative Traits Penalty: -<<print _penaltyPercent>>%</p> <</if>> <<if _bonusMoney > 0>> <p style="color: #ffc107; font-size: 16px; margin: 0 0 10px 0;">Skill Bonus: +$<<print _bonusMoney>></p> <</if>> <p style="color: #51cf66; font-size: 20px; margin: 0; font-weight: bold;">Total Earned: $<<print _totalPay>></p> </div> <!-- Trait Gained Notification --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0; text-align: center;">✨ NEW TRAIT ACQUIRED! ✨</h2> <p style="color: #9b59b6; font-size: 18px; margin: 10px 0 0 0; text-align: center; font-weight: bold;">_gainedTrait</p> <p style="color: #ccc; font-size: 14px; margin: 5px 0 0 0; text-align: center;">Your experiences have shaped you.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #007FFF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Lounge</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Random client gender --> <<set _clientGender = either("male", "female")>> <<set _playerGender = $bodyParts.gender>> <!-- Calculate earnings --> <<set _basePay = random(250, 1500)>> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _bonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait) || $skills.includes(_trait)>> <<set _bonusMoney += 15>> <</if>> <</for>> <<set _brothelNegativeTraits = ["Ugly", "Scarred", "Plain", "Blemished", "Overweight", "Underweight", "Stubborn", "Paranoid", "Jealous", "Dull", "Immature"]>> <<set _penaltyPercent = 0>> <<for _trait range _brothelNegativeTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait)>> <<set _penaltyPercent += 10>> <</if>> <</for>> <!-- Calculate stat penalty (charisma requirement: 35) --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _statMultiplier = 1.0>> <<if _totalCharisma < 35>> <<set _statMultiplier = _totalCharisma / 35>> <<if _statMultiplier < 0>> <<set _statMultiplier = 0>> <</if>> <</if>> <!-- Apply all multipliers --> <<set _penaltyMultiplier = 1.0 - (_penaltyPercent / 100)>> <<set _totalPay = Math.round(_basePay * _statMultiplier * _penaltyMultiplier) + _bonusMoney>> <<set $money += _totalPay>> <!-- Increment counters --> <<set $brothelClients += 1>> <<set $brothelClientsToday += 1>> <!-- Handle trait gain (15% chance) --> <<set _gainedTrait = "">> <<set _traitGained = false>> <<if random(1, 100) <= 15>> <<set _possibleGains = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _availableGains = []>> <<for _gain range _possibleGains>> <<if !$mentalTraits.includes(_gain) && !$physicalTraits.includes(_gain) && !$skills.includes(_gain)>> <<run _availableGains.push(_gain)>> <</if>> <</for>> <<if _availableGains.length > 0>> <<set _gainedTrait = _availableGains[random(0, _availableGains.length - 1)]>> <<set _traitGained = true>> <<if _gainedTrait === "Dominant" || _gainedTrait === "Submissive">> <<if _gainedTrait === "Dominant">> <<set $mentalTraits.delete("Submissive")>> <<else>> <<set $mentalTraits.delete("Dominant")>> <</if>> <<set $mentalTraits.push(_gainedTrait)>> <<elseif _gainedTrait === "Dancing" || _gainedTrait === "High Heels Proficient" || _gainedTrait === "Sexually Skilled" || _gainedTrait === "Serving" || _gainedTrait === "Persuasion">> <<set $skills.push(_gainedTrait)>> <<else>> <<set $mentalTraits.push(_gainedTrait)>> <</if>> <</if>> <</if>> <!-- Advance time --> <<advancetime 60>> <!-- Select random scene --> <<set _sceneNumber = random(1, 5)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Client Session</h1> <<if _clientGender === "male" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A man flanked by bodyguards arrives in a private vehicle. The expensive cologne, custom suit, and quiet confidence mark him as someone powerful. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone clearly connected offers triple the standard rate for your time. You're one of the establishment's top earners now. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A well-known figure in the city trusts only you with his desires. Your skill and discretion are unmatched. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy client books you for a weekend. Your stamina and skill have become legendary. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An elite regular considers you irreplaceable. You've become his preferred indulgence. </p> </div> <</if>> <</if>> <<if _clientGender === "male" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A client pulls up in a car worth more than most homes. He books you for hours, and your skill keeps him coming back regularly. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone influential offers premium rates to secure your time. You're among the elite now. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A powerful figure trusts only you. Your skill and discretion have made you invaluable. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy client books you for days. You deliver consistent excellence that justifies the premium. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An elite regular calls you his secret addiction. You've perfected every art. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A woman wearing jewelry that could fund a small business arrives. She's accustomed to getting exactly what she wants, and you know how to provide it. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone well-connected becomes your devoted regular. Your talents are incomparable. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A wealthy woman offers obscene amounts for your exclusive services. You've become priceless. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An elite client demands your presence at private events. You're more than a worker—you're a prize. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A powerful woman confesses you've ruined others for her. You've reached the pinnacle. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An elegant woman in couture arrives with an entourage waiting outside. Your reputation in exclusive circles has made you her preferred choice. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone influential begs to keep you exclusive. You've become irreplaceable. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A woman of means seeks your touch. You're known in circles where money is no object. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An elite woman proclaims you the city's finest. Your reputation is unmatched. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A powerful woman admits you've spoiled her for anyone else. You're irreplaceable. </p> </div> <</if>> <</if>> <!-- Earnings Display --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💰 Session Complete</h2> <p style="color: #ccc; font-size: 16px; margin: 0 0 10px 0;">Base Payment: $<<print _basePay>></p> <<if _statMultiplier < 1.0>> <<set _statPenaltyPercent = Math.round((1.0 - _statMultiplier) * 100)>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Charisma Penalty: -<<print _statPenaltyPercent>>% (<<print _totalCharisma>>/35)</p> <</if>> <<if _penaltyPercent > 0>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Negative Traits Penalty: -<<print _penaltyPercent>>%</p> <</if>> <<if _bonusMoney > 0>> <p style="color: #ffc107; font-size: 16px; margin: 0 0 10px 0;">Skill Bonus: +$<<print _bonusMoney>></p> <</if>> <p style="color: #51cf66; font-size: 20px; margin: 0; font-weight: bold;">Total Earned: $<<print _totalPay>></p> </div> <!-- Trait Gained Notification --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0; text-align: center;">✨ NEW TRAIT ACQUIRED! ✨</h2> <p style="color: #9b59b6; font-size: 18px; margin: 10px 0 0 0; text-align: center; font-weight: bold;">_gainedTrait</p> <p style="color: #ccc; font-size: 14px; margin: 5px 0 0 0; text-align: center;">Your experiences have shaped you.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #007FFF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Lounge</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Random client gender --> <<set _clientGender = either("male", "female")>> <<set _playerGender = $bodyParts.gender>> <!-- Calculate earnings --> <<set _basePay = random(500, 5000)>> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _bonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait) || $skills.includes(_trait)>> <<set _bonusMoney += 15>> <</if>> <</for>> <<set _brothelNegativeTraits = ["Ugly", "Scarred", "Plain", "Blemished", "Overweight", "Underweight", "Stubborn", "Paranoid", "Jealous", "Dull", "Immature"]>> <<set _penaltyPercent = 0>> <<for _trait range _brothelNegativeTraits>> <<if $mentalTraits.includes(_trait) || $physicalTraits.includes(_trait)>> <<set _penaltyPercent += 10>> <</if>> <</for>> <!-- Calculate stat penalty (charisma requirement: 35) --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _statMultiplier = 1.0>> <<if _totalCharisma < 35>> <<set _statMultiplier = _totalCharisma / 35>> <<if _statMultiplier < 0>> <<set _statMultiplier = 0>> <</if>> <</if>> <!-- Apply all multipliers --> <<set _penaltyMultiplier = 1.0 - (_penaltyPercent / 100)>> <<set _totalPay = Math.round(_basePay * _statMultiplier * _penaltyMultiplier) + _bonusMoney>> <<set $money += _totalPay>> <!-- Increment counters --> <<set $brothelClients += 1>> <<set $brothelClientsToday += 1>> <!-- Handle trait gain (15% chance) --> <<set _gainedTrait = "">> <<set _traitGained = false>> <<if random(1, 100) <= 15>> <<set _possibleGains = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion"]>> <<set _availableGains = []>> <<for _gain range _possibleGains>> <<if !$mentalTraits.includes(_gain) && !$physicalTraits.includes(_gain) && !$skills.includes(_gain)>> <<run _availableGains.push(_gain)>> <</if>> <</for>> <<if _availableGains.length > 0>> <<set _gainedTrait = _availableGains[random(0, _availableGains.length - 1)]>> <<set _traitGained = true>> <<if _gainedTrait === "Dominant" || _gainedTrait === "Submissive">> <<if _gainedTrait === "Dominant">> <<set $mentalTraits.delete("Submissive")>> <<else>> <<set $mentalTraits.delete("Dominant")>> <</if>> <<set $mentalTraits.push(_gainedTrait)>> <<elseif _gainedTrait === "Dancing" || _gainedTrait === "High Heels Proficient" || _gainedTrait === "Sexually Skilled" || _gainedTrait === "Serving" || _gainedTrait === "Persuasion">> <<set $skills.push(_gainedTrait)>> <<else>> <<set $mentalTraits.push(_gainedTrait)>> <</if>> <</if>> <</if>> <!-- Advance time --> <<advancetime 60>> <!-- Select random scene --> <<set _sceneNumber = random(1, 5)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Client Session</h1> <<if _clientGender === "male" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A distinguished man arrives under discreet security. Everything about him—the bespoke tailoring, the subtle authority—screams power and wealth. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone who controls significant parts of the city offers a blank check. Your services have become priceless. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A figure of immense influence seeks your discrete companionship. You're among the city's elite now. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone at the top of the city's power structure begs for your time. Your reputation spans the entire metro. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> The establishment's owner personally ensures your every need. You're the crown jewel of this place. </p> </div> <</if>> <</if>> <<if _clientGender === "male" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone influential enough to have the venue cleared arrives. You're one of the few trusted with clients of this caliber. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone who runs half the city pays anything to secure you. You've become legendary. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A figure of immense power seeks your exclusive services. You're known across the entire city. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone at the pinnacle of the city's hierarchy pleads for your attention. Your mastery is unquestionable. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> The establishment treats you like royalty. You're the ultimate professional. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "male">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A woman who clearly runs something significant enters with absolute confidence. She pays triple the rate without blinking, and you're worth every cent. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone who controls vast wealth offers ownership stakes to keep you exclusive. You're invaluable. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> An influential woman seeks to learn from you. You're a living legend in the city. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A woman at the top declares you the finest in the city. Your reputation is unmatched. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> The establishment offers you partnership. You've conquered the profession completely. </p> </div> <</if>> <</if>> <<if _clientGender === "female" && _playerGender === "female">> <<if _sceneNumber === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A powerful woman whose name you recognize arrives in absolute discretion. You've become legendary enough to serve the city's true elite. </p> </div> <<elseif _sceneNumber === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone who owns half the city begs to keep you. You've become irreplaceable at the highest level. </p> </div> <<elseif _sceneNumber === 3>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A woman of immense influence seeks your touch. You're legendary across the entire metro. </p> </div> <<elseif _sceneNumber === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> Someone at the pinnacle of power proclaims you the city's finest. You've achieved perfection. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> The establishment offers you ownership. You've conquered the profession completely. </p> </div> <</if>> <</if>> <!-- Earnings Display --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💰 Session Complete</h2> <p style="color: #ccc; font-size: 16px; margin: 0 0 10px 0;">Base Payment: $<<print _basePay>></p> <<if _statMultiplier < 1.0>> <<set _statPenaltyPercent = Math.round((1.0 - _statMultiplier) * 100)>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Charisma Penalty: -<<print _statPenaltyPercent>>% (<<print _totalCharisma>>/35)</p> <</if>> <<if _penaltyPercent > 0>> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 10px 0;">Negative Traits Penalty: -<<print _penaltyPercent>>%</p> <</if>> <<if _bonusMoney > 0>> <p style="color: #ffc107; font-size: 16px; margin: 0 0 10px 0;">Skill Bonus: +$<<print _bonusMoney>></p> <</if>> <p style="color: #51cf66; font-size: 20px; margin: 0; font-weight: bold;">Total Earned: $<<print _totalPay>></p> </div> <!-- Trait Gained Notification --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0; text-align: center;">✨ NEW TRAIT ACQUIRED! ✨</h2> <p style="color: #9b59b6; font-size: 18px; margin: 10px 0 0 0; text-align: center; font-weight: bold;">_gainedTrait</p> <p style="color: #ccc; font-size: 14px; margin: 5px 0 0 0; text-align: center;">Your experiences have shaped you.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #007FFF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Lounge</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Aquarium">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐠 Sunfish City Aquarium</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0;"> The aquarium's grand entrance hall opens into a world of blue. Massive glass tanks stretch from floor to ceiling, filled with... sunfish. Only sunfish. Exclusively sunfish. Every single tank contains ocean sunfish (Mola mola) in various sizes, all drifting lazily and rotating in that vacant way they do. You expected dolphins, sharks, tropical fish, coral reefs... but no. Just hundreds upon hundreds of sunfish. The plaques on each tank read things like "Sunfish Exhibit A", "Sunfish Exhibit B", and "Really Big Sunfish Exhibit". Why would anyone build an entire aquarium dedicated solely to sunfish? It doesn't make any sense. The gentle sound of bubbling water and the blank stares of countless sunfish create an unsettling atmosphere. </p> </div> <h2 style="color: #1e90ff;">What do you want to do?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Explore Exhibits --> <div style="border: 3px solid #00ced1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #00ced1; margin-top: 0;">🌊 Explore Exhibits</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Wander through the various sunfish exhibits. There are baby sunfish, adult sunfish, and really big sunfish. That's it. That's all there is.</p> <<link "<div style='background: #00ced1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Explore</div>">> <<set $timeInMinutes += 60>> <<set _sunfishRoll = Math.random()>> <<set _gotSunfishTrait = false>> <<if _sunfishRoll < 0.0001 && !$physicalTraits.includes("Sunfish")>> <<run $physicalTraits.push("Sunfish")>> <<set _gotSunfishTrait = true>> <</if>> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px; max-width: 500px;"> <h2 style="color: #00ced1; margin-top: 0;">🌊 Exploring the Exhibits</h2> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> You wander through the dimly lit corridors, passing tank after tank of slowly rotating sunfish. Their vacant eyes follow you—or maybe they don't, it's hard to tell. </p> <div style="margin: 20px 0;"> <img src="Images/Other/Sunfish.jpg" style="max-width: 100%; border-radius: 8px; border: 2px solid #00ced1;"> </div> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> The sunfish drift peacefully, their enormous disc-shaped bodies rotating slowly in the water. It's actually quite mesmerizing. </p> <<if _gotSunfishTrait>> <div style="background: #ffd700; padding: 15px; border-radius: 8px; margin: 15px 0; border: 3px solid #ffaa00;"> <p style="color: #000; font-weight: bold; font-size: 18px; margin: 0 0 10px 0;">✨ ULTRA RARE! ✨</p> <p style="color: #000; font-weight: bold; margin: 0;">You feel a strange connection to the sunfish... You have become one with the Mola mola!</p> <p style="color: #ff6b00; font-weight: bold; margin: 10px 0 0 0;">Gained trait: Sunfish</p> </div> <</if>> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> As you continue walking, you swear someone is following you from the corner of your eye. Every time you turn to look, there's no one there... except for a suspicious puddle on the floor and a trail of water leading around the corner. </p> <p style="color: #ffc107; line-height: 1.6; margin: 15px 0; font-style: italic;"> The wet footprints look oddly disc-shaped. </p> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #00ced1; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Continue</div>">> <<run Dialog.close()>> <<goto "Aquarium">> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Touch Tank --> <div style="border: 3px solid #20b2aa; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20b2aa; margin-top: 0;">✋ Touch Tank</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Interactive touch pool with small sunfish. They feel slimy and confused. Why is this the only interactive exhibit?</p> <<link "<div style='background: #20b2aa; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Touch Tank</div>">> <<set $timeInMinutes += 30>> <<set _sunfishRoll = Math.random()>> <<set _gotSunfishTrait = false>> <<if _sunfishRoll < 0.0001 && !$physicalTraits.includes("Sunfish")>> <<run $physicalTraits.push("Sunfish")>> <<set _gotSunfishTrait = true>> <</if>> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px; max-width: 500px;"> <h2 style="color: #20b2aa; margin-top: 0;">✋ Touch Tank Experience</h2> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> You approach the shallow touch pool, eager to feel the texture of a sunfish. Several small sunfish drift lazily near the surface. </p> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> You reach your hand into the water toward one... and it instantly disappears. Not swims away—<em>disappears</em>. You blink and try again with another sunfish. The same thing happens. </p> <<if _gotSunfishTrait>> <div style="background: #ffd700; padding: 15px; border-radius: 8px; margin: 15px 0; border: 3px solid #ffaa00;"> <p style="color: #000; font-weight: bold; font-size: 18px; margin: 0 0 10px 0;">✨ ULTRA RARE! ✨</p> <p style="color: #000; font-weight: bold; margin: 0;">As your hand touches the water, you feel a profound transformation... You have become one with the Mola mola!</p> <p style="color: #ff6b00; font-weight: bold; margin: 10px 0 0 0;">Gained trait: Sunfish</p> </div> <</if>> <p style="color: #ff6b6b; line-height: 1.6; margin: 15px 0; font-weight: bold;"> Every single sunfish you try to touch vanishes the moment your hand gets close. </p> <p style="color: #aaa; line-height: 1.6; margin: 15px 0; font-style: italic;"> You have no idea what's going on. This place is deeply unsettling. </p> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #20b2aa; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Back Away Slowly</div>">> <<run Dialog.close()>> <<goto "Aquarium">> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Gift Shop --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🎁 Gift Shop</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Browse sunfish-themed souvenirs. Plush sunfish, sunfish keychains, sunfish t-shirts, sunfish mugs, sunfish everything...</p> <<link "<div style='background: #ffd700; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse Shop</div>">> <<goto "AquariumGiftShop">> <</link>> </div> <!-- Cafe --> <div style="border: 3px solid #32cd32; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #32cd32; margin-top: 0;">☕ Ocean View Cafe</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Grab a bite with a view of the main tank. Watch sunfish slowly rotate while you eat. It's hypnotic and deeply weird.</p> <<link "<div style='background: #32cd32; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Cafe</div>">> <<goto "AquariumCafe">> <</link>> </div> </div> <!-- NPCs Section --> <h2 style="color: #1e90ff;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">Normal Man</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;">Normal Employee</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to Normal Man</div>">> <<goto "SunfishFakeInterface">> <</link>> </div> </div> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "IllegalServices">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff4444; text-align: center;">🔓 Illegal Services</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff4444;"> <p style="color: #ccc; font-size: 18px; margin: 0;"> The old man leans in close, his breath reeking of cheap whiskey. "Looking for some... personality adjustments? I know people. They can make problems disappear, or give you new... perspectives. For the right price, of course. Hehehehe..." </p> </div> <div style="background: #2a2a2a; border: 2px solid #ffc107; padding: 15px; border-radius: 10px; margin-bottom: 25px;"> <p style="color: #ffc107; margin: 0; font-weight: bold; font-size: 16px;">💰 Your Money: $<<print $money.toLocaleString()>></p> <p style="color: #aaa; margin: 5px 0 0 0; font-size: 14px;">All services cost $15,000</p> </div> <!-- REMOVE NEGATIVE TRAITS --> <<set _negativeTraits = []>> <<set _purelyNegativeTraits = ["Bitchy", "Cruel", "Jealous", "Lazy", "Arrogant", "Complacent", "Dull", "Cowardly", "Immature", "Impatient", "Foolish", "Plain", "Ugly", "Overweight", "Underweight", "Clumsy", "Weak", "Stiff", "Blemished"]>> <<for _trait range $mentalTraits>> <<if _purelyNegativeTraits.includes(_trait)>> <<run _negativeTraits.push(_trait)>> <</if>> <</for>> <<for _trait range $physicalTraits>> <<if _purelyNegativeTraits.includes(_trait)>> <<run _negativeTraits.push(_trait)>> <</if>> <</for>> <<if _negativeTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">❌ Remove Negative Traits</h2> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">Get rid of your worst qualities... for a price.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 15px;"> <<for _trait range _negativeTraits>> <<capture _trait>> <<if $money >= 15000>> <div style="border: 2px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 18px;">_trait</h3> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Remove for $500</div>">> <<set $money -= 500>> <<if $physicalTraits.includes(_trait)>> <<run $physicalTraits.delete(_trait)>> <<else>> <<run $mentalTraits.delete(_trait)>> <</if>> <<goto "IllegalServices">> <</link>> </div> <<else>> <div style="border: 2px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; opacity: 0.5;"> <h3 style="color: #666; margin: 0 0 10px 0; font-size: 18px;">_trait</h3> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Can't Afford</div> </div> <</if>> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #666; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #666; padding-bottom: 10px;">❌ Remove Negative Traits</h2> <p style="color: #666; font-size: 14px; margin: 0; text-align: center; font-style: italic;">You have no negative traits to remove.</p> </div> <</if>> <!-- ADD MIXED TRAITS --> <<set _availableMixedTraits = ["Introverted", "Honest", "Submissive", "Shy", "Aggressive", "Passive", "Pessimistic", "Stubborn", "Paranoid"]>> <<set _purchasableTraits = []>> <<for _trait range _availableMixedTraits>> <<if !$mentalTraits.includes(_trait)>> <!-- Check for conflicts --> <<set _conflict = setup.getConflictingTrait(_trait, $mentalTraits)>> <<if !_conflict>> <<run _purchasableTraits.push(_trait)>> <</if>> <</if>> <</for>> <<if _purchasableTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">➕ Add Personality Traits</h2> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">Acquire new personality traits through... unconventional methods.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 15px;"> <<for _trait range _purchasableTraits>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<set _traitColor = _traitValue >= 0 ? "#9b59b6" : "#ff6b6b">> <<if $money >= 15000>> <div style="border: 2px solid _traitColor; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: _traitColor; margin: 0 0 5px 0; font-size: 18px;">_trait</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 10px 0;">Value: <<if _traitValue > 0>>+<</if>>_traitValue</p> <<link "<div style='background: _traitColor; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Buy for $15,000</div>">> <<set $money -= 15000>> <!-- Remove conflicting trait if exists --> <<set _conflictToRemove = setup.getConflictingTrait(_trait, $mentalTraits)>> <<if _conflictToRemove>> <<if _conflictToRemove === $characterCreationTrait>> <<set $characterCreationTrait = null>> <<else>> <<run $mentalTraits.delete(_conflictToRemove)>> <</if>> <</if>> <<run $mentalTraits.push(_trait)>> <<goto "IllegalServices">> <</link>> </div> <<else>> <div style="border: 2px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; opacity: 0.5;"> <h3 style="color: #666; margin: 0 0 5px 0; font-size: 18px;">_trait</h3> <p style="color: #666; font-size: 13px; margin: 0 0 10px 0;">Value: <<if _traitValue > 0>>+<</if>>_traitValue</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Can't Afford</div> </div> <</if>> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #666; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #666; padding-bottom: 10px;">➕ Add Personality Traits</h2> <p style="color: #666; font-size: 14px; margin: 0; text-align: center; font-style: italic;">No traits available to purchase (you may already have them or conflicting traits).</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #434343; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Shady Shop</div>">> <<goto "ShadyShop">> <</link>> </div> </div> <</nobr>>
Work In Progress <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto $lastLocation>> <</link>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">❓ Information Desk</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a6f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> You approach the information desk. The figure standing behind it is... wrong. They're impossibly tall and disc-shaped, wearing a soaking wet trench coat that's clearly too small. Their "face" is just two bulging eyes staring in slightly different directions. They're not moving like a human should - instead, they're sort of... wobbling? Rotating? There's a constant stream of water dripping from the coat onto the floor, forming a substantial puddle. You can hear a faint "bloop bloop" sound coming from somewhere within the coat. This absolutely doesn't make sense. It's as if multiple mola mola sunfish somehow stacked themselves inside a trench coat and are pretending to be a person, which is impossible because fish can't do that. </p> </div> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> The "person" slowly rotates to face you, making a sloshing sound. Their mouth opens slightly. </p> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #1e90ff; margin-bottom: 20px;"> <p style="color: #1e90ff; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> "Bloop bloop. Nothing to see here. Bloop bloop." </p> </div> <p style="color: #ccc; font-size: 16px; margin-top: 20px;"> They continue staring at you with those vacant, fishy eyes. A small fin briefly pokes out from under the trench coat before quickly retracting. You're not sure what you expected. </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐠 Trade with Normal Man</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> "Bloop bloop. Nothing to see here. Bloop bloop." </p> </div> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff;"> <p style="color: #ccc; font-size: 16px;"> Normal Man stares at you with vacant, unblinking eyes. Water drips from somewhere within the trench coat. You hear a faint sloshing sound. A fin briefly pokes out before disappearing again. This is deeply uncomfortable. </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">💬 Talk to Normal Man</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0;"> You attempt to strike up a conversation with Normal Man. </p> </div> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Normal Man who is Normal stares at you. His bulging eyes don't blink. They don't move. One eye seems to be looking at you. The other is looking at something behind you. Or maybe at nothing. The silence stretches on. Water continues to drip. You hear a wet slapping sound from inside the coat. The stare continues. It's making you very uncomfortable. </p> <p style="color: #ccc; font-size: 16px; margin-top: 20px;"> You give up at any attempt to talk to the... Normal Man... </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Normal Man</h1> <p style="color: white; margin: 0; font-size: 18px; text-align: center;"> Normal Employee </p> </div> <!-- NPC Stats --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #17a2b8; padding-bottom: 10px;">📊 Stats</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; font-size: 16px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Charisma:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Dexterity:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Strength:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Intelligence:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> </div> </div> <!-- NPC Appearance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">👤 Appearance</h3> <div style="font-size: 16px; color: #ccc; line-height: 1.8;"> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Hair:</strong> None</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Skin Tone:</strong> Wet and Slimy</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Physique:</strong> Disc-Shaped</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Chest:</strong> ????</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Butt:</strong> ????</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Gender:</strong> Bloop</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Age:</strong> ????</p> </div> </div> <!-- NPC Traits --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Disc-Shaped</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Wet</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Wobbling</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Has Fins (??)</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Multiple Eyes</span> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Vacant</span> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Fishy</span> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Suspicious</span> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Definitely Not Multiple Sunfish</span> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Blooping</span> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Standing Still</span> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Avoiding Questions</span> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Rotating Slowly</span> </div> </div> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 25px;"> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💱 Initiate Trade</div>">> <<goto "NormalManTrade">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💬 Talk</div>">> <<goto "NormalManTalk">> <</link>> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #2a2a2a; color: #667eea; padding: 12px 30px; border-radius: 8px; border: 2px solid #667eea; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Go Back</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
Work In Progress <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto $lastLocation>> <</link>>
<<nobr>> /* Initialize relationship if this is first meeting */ <<if !$npcRelationships["Fen Ris"]>> <<set $npcRelationships["Fen Ris"] = { level: 1, xp: 0, maxXp: 20, levelName: "Stranger", bestFriendUnlocked: false }>> <</if>> /* Add Fen Ris to met NPCs if not already there */ <<if !$metNPCs.includes("Fen Ris")>> <<run $metNPCs.push("Fen Ris")>> <</if>> <<silently>> /* Get all trainers by job */ <<set _trainers = setup.getNPCsByJob("Fitness Trainer")>> <<set _canTrainToday = true>> /* Check if player already trained today (track by job, not name) */ <<if $lastFenRisTrainingDay === $dayNumber>> <<set _canTrainToday = false>> <</if>> <</silently>> <div style="background: linear-gradient(135deg, #ff6b6b 0%, #c92a2a 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px;"> <h2 style="margin: 0; color: white; text-align: center;">Personal Training</h2> </div> <<if _trainers && _trainers.length > 0>> <<for _trainerIndex = 0; _trainerIndex < _trainers.length; _trainerIndex++>> <<set _trainer = _trainers[_trainerIndex]>> <<silently>> /* Calculate trainer effectiveness */ <<set _effectiveness = 100>> /* Base effectiveness */ /* Check if this is the original Fen Ris by checking for Were-Creature trait */ <<set _isOriginalFenRis = _trainer.physicalTraits.includes("Were-Creature")>> <<if !_isOriginalFenRis>> /* Calculate trainer's total stats (base + trait/skill bonuses) */ <<set _trainerStrength = _trainer.stats.strength>> <<set _trainerDex = _trainer.stats.dexterity>> /* Add bonuses from physical traits */ <<for _i = 0; _i < _trainer.physicalTraits.length; _i++>> <<set _trait = _trainer.physicalTraits[_i]>> <<if setup.traitBonuses[_trait]>> <<if setup.traitBonuses[_trait].strength>> <<set _trainerStrength += setup.traitBonuses[_trait].strength>> <</if>> <<if setup.traitBonuses[_trait].dexterity>> <<set _trainerDex += setup.traitBonuses[_trait].dexterity>> <</if>> <</if>> <</for>> /* Add bonuses from mental traits */ <<for _i = 0; _i < _trainer.mentalTraits.length; _i++>> <<set _trait = _trainer.mentalTraits[_i]>> <<if setup.traitBonuses[_trait]>> <<if setup.traitBonuses[_trait].strength>> <<set _trainerStrength += setup.traitBonuses[_trait].strength>> <</if>> <<if setup.traitBonuses[_trait].dexterity>> <<set _trainerDex += setup.traitBonuses[_trait].dexterity>> <</if>> <</if>> <</for>> /* Add bonuses from skills */ <<for _i = 0; _i < _trainer.skills.length; _i++>> <<set _skill = _trainer.skills[_i]>> <<if setup.skillBonuses[_skill]>> <<if setup.skillBonuses[_skill].strength>> <<set _trainerStrength += setup.skillBonuses[_skill].strength>> <</if>> <<if setup.skillBonuses[_skill].dexterity>> <<set _trainerDex += setup.skillBonuses[_skill].dexterity>> <</if>> <</if>> <</for>> /* Check if both stats meet the threshold */ <<if _trainerStrength >= 80 && _trainerDex >= 80>> <<set _effectiveness = 100>> <<else>> /* Start at 50% base effectiveness */ <<set _effectiveness = 50>> /* Compare physical traits (excluding body parts) */ <<set _fenRisPhysical = ["Tall", "Muscular", "Athletic Build", "Sharp Features", "Were-Creature"]>> <<set _matchingPhysical = 0>> <<for _i = 0; _i < _fenRisPhysical.length; _i++>> <<if _trainer.physicalTraits.includes(_fenRisPhysical[_i])>> <<set _matchingPhysical++>> <</if>> <</for>> <<set _effectiveness += (_matchingPhysical / _fenRisPhysical.length) * 15>> /* Compare mental traits */ <<set _fenRisMental = ["Confident", "Calm", "Honest", "Patient"]>> <<set _matchingMental = 0>> <<for _i = 0; _i < _fenRisMental.length; _i++>> <<if _trainer.mentalTraits.includes(_fenRisMental[_i])>> <<set _matchingMental++>> <</if>> <</for>> <<set _effectiveness += (_matchingMental / _fenRisMental.length) * 10>> /* Compare skills */ <<set _fenRisSkills = ["Athletics", "Heavy Lifting", "Combat", "Yoga", "Teaching"]>> <<set _matchingSkills = 0>> <<for _i = 0; _i < _fenRisSkills.length; _i++>> <<if _trainer.skills.includes(_fenRisSkills[_i])>> <<set _matchingSkills++>> <</if>> <</for>> <<set _effectiveness += (_matchingSkills / _fenRisSkills.length) * 15>> /* Compare appearance (hair color, skin tone, age) */ <<set _appearanceMatches = 0>> <<if _trainer.appearance.hairColor === "Black">><<set _appearanceMatches++>><</if>> <<if _trainer.appearance.skinTone === "tan">><<set _appearanceMatches++>><</if>> <<if _trainer.appearance.age === "Adult">><<set _appearanceMatches++>><</if>> <<set _effectiveness += (_appearanceMatches / 3) * 10>> /* Round to whole number */ <<set _effectiveness = Math.round(_effectiveness)>> <</if>> <</if>> /* Calculate actual stat gains based on effectiveness */ <<set _strengthGain = Math.round(5 * (_effectiveness / 100))>> <<set _dexGain = Math.round(4 * (_effectiveness / 100))>> <<set _charismaGain = Math.round(3 * (_effectiveness / 100))>> <<set _intGain = Math.round(2 * (_effectiveness / 100))>> <</silently>> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b; margin-bottom: 20px;"> <h3 style="color: #ff6b6b; margin-top: 0;">About Your Trainer</h3> <!-- NPC Image --> <<set _trainerImage = setup.getNPCImage(_trainer.name)>> <<if _trainerImage>> <div style="text-align: center; margin-bottom: 20px;"> <img @src="_trainerImage" style="max-width: 300px; max-height: 400px; border-radius: 10px; border: 3px solid #ff6b6b; box-shadow: 0 0 20px rgba(255,107,107,0.6);" onerror="this.style.display='none';"> </div> <</if>> <<if _isOriginalFenRis>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> <<= _trainer.name>> stands before you, her imposing figure radiating strength and confidence. Her olive-brown skin glistens with a light sheen of sweat, and her wild black mane of wavy hair reaches her upper back, slightly unkempt in that effortlessly cool way. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> Her deep yellow eyes with black sclera meet yours with an intensity that's both captivating and slightly intimidating. Black wolf ears perk up from her hair, twitching as she sizes you up, while a matching tail sways lazily behind her. Her upper arms and legs are covered in dark fur, ending in sharp claws that she's clearly mastered handling around gym equipment. When she grins, revealing sharp canines, you feel both welcomed and challenged. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> "Ready to push your limits?" she asks in a laid-back but direct tone. Despite her nonchalant demeanor, there's a forceful charisma about her that makes you want to prove yourself. Her high moral standards are evident in how she carries herself - no shortcuts, no excuses, just honest hard work. </p> <</if>> <<if !_isOriginalFenRis>> <div style="margin-top: 15px; padding: 12px; background-color: #1a1a1a; border-left: 4px solid #ffd43b; border-radius: 4px;"> <p style="color: #ffd43b; margin: 0; font-weight: bold;">Training Effectiveness: <<= _effectiveness>>%</p> <<if _effectiveness < 100>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-size: 14px;"> This trainer is less effective than the original Fen Ris. <<if _trainerStrength < 80 || _trainerDex < 80>> They need at least 80 Strength and 80 Dexterity for full effectiveness. <</if>> </p> <</if>> </div> <</if>> </div> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 20px;"> <h3 style="color: #51cf66; margin-top: 0;">Training Session Details</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 15px;"> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 6px;"> <div style="color: #999; font-size: 14px;">Cost</div> <div style="color: #51cf66; font-size: 20px; font-weight: bold;">$100</div> </div> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 6px;"> <div style="color: #999; font-size: 14px;">Duration</div> <div style="color: #51cf66; font-size: 20px; font-weight: bold;">4 Hours</div> </div> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 15px;"> <h4 style="color: #51cf66; margin: 0 0 10px 0;">Stat Gains (at <<= _effectiveness>>% effectiveness):</h4> <div style="color: #e0e0e0; line-height: 1.8;"> • Strength: <span style="color: #ff6b6b; font-weight: bold;">+<<= _strengthGain>></span><br> • Dexterity: <span style="color: #51cf66; font-weight: bold;">+<<= _dexGain>></span><br> • Charisma: <span style="color: #ffd43b; font-weight: bold;">+<<= _charismaGain>></span><br> • Intelligence: <span style="color: #4dabf7; font-weight: bold;">+<<= _intGain>></span> </div> </div> <<if !_canTrainToday>> <div style="background-color: #c92a2a; padding: 12px; border-radius: 6px; margin-bottom: 15px;"> <p style="color: white; margin: 0; text-align: center; font-weight: bold;"> You've already trained today. Come back tomorrow! </p> </div> <<elseif $money < 100>> <div style="background-color: #c92a2a; padding: 12px; border-radius: 6px; margin-bottom: 15px;"> <p style="color: white; margin: 0; text-align: center; font-weight: bold;"> You don't have enough money for a training session. (Need: $100) </p> </div> <<else>> <<capture _trainer, _effectiveness, _strengthGain, _dexGain, _charismaGain, _intGain>> <<link "<div style='background: #ff6b6b; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Train with <<= _trainer.name>> ($100, 4 hours)</div>" "FenRisTrainingSession">> <<set $money -= 100>> <<set $lastFenRisTrainingDay = $dayNumber>> <<set $trainedWith = _trainer.name>> <<set $trainingEffectiveness = _effectiveness>> <<set $strengthGained = _strengthGain>> <<set $dexGained = _dexGain>> <<set $charismaGained = _charismaGain>> <<set $intGained = _intGain>> /* Apply stat gains */ <<set $stats.strength += _strengthGain>> <<set $stats.dexterity += _dexGain>> <<set $stats.charisma += _charismaGain>> <<set $stats.intelligence += _intGain>> /* Add relationship XP for training together */ <<run setup.addRelationshipXP(_trainer.name, 2)>> /* Advance time by 4 hours */ <<run advanceTime(240)>> <</link>> <</capture>> <</if>> </div> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; margin-bottom: 20px;"> <h3 style="color: #9b59b6; margin-top: 0;">Other Options</h3> <<capture _trainer>> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Talk to <<= _trainer.name>> </div>" "NPCInteraction">> <<set $tradingWithNPC = _trainer>> <<set $currentTradeNPC = _trainer>> /* Add relationship XP for talking */ <<run setup.addRelationshipXP(_trainer.name, 2)>> <</link>> <</capture>> </div> <</for>> <<else>> <div style="background-color: #c92a2a; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: white; margin: 0; text-align: center;"> No fitness trainers are currently available. </p> </div> <</if>> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Gym</div>" "OpahFitness">><</link>> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #ff6b6b 0%, #c92a2a 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px;"> <h2 style="margin: 0; color: white; text-align: center;">Training Complete!</h2> </div> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 20px;"> <<if $trainedWith === "Fen Ris">> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> The next four hours are intense. Fen Ris pushes you through a grueling combination of strength training, cardio, flexibility work, and mental conditioning. Her yellow eyes watch your every move, correcting your form with a sharp but not unkind word. Her clawed hands demonstrate proper technique with surprising grace. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> "Good," she says simply when you finish, her tail swishing approvingly. "You actually put in the work. That's what I like to see." There's no excessive praise, just honest acknowledgment of your effort. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> Despite the exhaustion, you feel stronger, more agile, and strangely more confident. Even your mind feels sharper from the mental focus required to keep up with her demanding routine. </p> <<else>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> <<= $trainedWith>> guides you through a <<= $trainingEffectiveness>>% effective training session. While competent, you can't help but notice the difference from when Fen Ris was in charge. </p> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 20px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">Your Gains:</h3> <div style="color: #e0e0e0; font-size: 18px; line-height: 2;"> <span style="color: #ff6b6b;">■</span> Strength: <span style="color: #ff6b6b; font-weight: bold;">+<<= $strengthGained>></span><br> <span style="color: #51cf66;">■</span> Dexterity: <span style="color: #51cf66; font-weight: bold;">+<<= $dexGained>></span><br> <span style="color: #ffd43b;">■</span> Charisma: <span style="color: #ffd43b; font-weight: bold;">+<<= $charismaGained>></span><br> <span style="color: #4dabf7;">■</span> Intelligence: <span style="color: #4dabf7; font-weight: bold;">+<<= $intGained>></span> </div> <<if $trainingEffectiveness < 100>> <div style="margin-top: 15px; padding: 10px; background-color: #2d2d2d; border-left: 4px solid #ffd43b; border-radius: 4px;"> <p style="color: #ffd43b; margin: 0; font-size: 14px;"> Training effectiveness was only <<= $trainingEffectiveness>>%. With Fen Ris, you would have gained more! </p> </div> <</if>> </div> </div> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>" "OpahFitness">><</link>> </div> <</nobr>>
<<nobr>> /* Ensure all NPCs have relationship entries - BUT DON'T OVERWRITE EXISTING ONES */ <<for _i = 0; _i < $npcs.length; _i++>> <<if !$relationships[$npcs[_i].name]>> <<set $relationships[$npcs[_i].name] = { level: 1, points: 0 }>> <</if>> <</for>> /* Clean up orphaned relationships (old names that don't match any current NPC) */ <<set _currentNPCNames = $npcs.map(function(npc) { return npc.name; })>> <<set _relationshipNames = Object.keys($relationships)>> <<for _j = 0; _j < _relationshipNames.length; _j++>> <<set _relName = _relationshipNames[_j]>> <<if !_currentNPCNames.includes(_relName) && $metNPCs.includes(_relName)>> /* This is an orphaned relationship - remove it from metNPCs too */ <<set $metNPCs = $metNPCs.filter(function(name) { return name !== _relName; })>> <</if>> <</for>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b9d; text-align: center;">💕 Relationships</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b9d 0%, #c92a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b9d;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> Track your connections with the people of Sunfish City </p> </div> <!-- Sort relationships by points (highest to lowest) - ONLY INCLUDE MET NPCs --> <<set _sortedRelationships = []>> <<for _npcName, _rel range $relationships>> <<if $metNPCs.includes(_npcName)>> <<set _sortedRelationships.push({name: _npcName, rel: _rel})>> <</if>> <</for>> <<run _sortedRelationships.sort(function(a, b) { return b.rel.points - a.rel.points; })>> <<if _sortedRelationships.length === 0>> <div style="background-color: #2d2d2d; padding: 30px; border-radius: 12px; border: 3px solid #666; text-align: center;"> <p style="color: #999; font-size: 18px; margin: 0;"> You haven't met anyone yet. Go explore Sunfish City and make some connections! </p> </div> <<else>> <!-- Relationship List --> <div style="display: grid; gap: 15px; margin-bottom: 25px;"> <<for _i = 0; _i < _sortedRelationships.length; _i++>> <<set _npcName = _sortedRelationships[_i].name>> <<set _rel = _sortedRelationships[_i].rel>> <<set _npc = setup.getNPCByName(_npcName)>> <<set _relColor = setup.getRelationshipColor(_rel.level)>> <<if _rel.level < 5>> <<set _nextThreshold = [25, 75, 175, 425][_rel.level - 1]>> <<set _currentLevelMin = [0, 25, 75, 175][_rel.level - 1]>> <<set _xpInLevel = _rel.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <<else>> <<set _xpPercent = 100>> <</if>> <<capture _npcName, _relColor, _rel, _xpPercent>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid <<= _relColor>>; box-shadow: 0 4px 12px rgba(0,0,0,0.6), 0 0 20px <<= _relColor>>33; cursor: pointer; transition: all 0.3s ease;" onmouseover="this.style.transform='scale(1.02)'; this.style.boxShadow='0 6px 16px rgba(0,0,0,0.8), 0 0 30px <<= _relColor>>66';" onmouseout="this.style.transform='scale(1)'; this.style.boxShadow='0 4px 12px rgba(0,0,0,0.6), 0 0 20px <<= _relColor>>33';"> <<link `"<div style='display: flex; justify-content: space-between; align-items: center;'><h2 style='color: " + _relColor + "; margin: 0; font-size: 22px; text-shadow: 0 0 10px " + _relColor + "88;'>" + _npcName + "</h2><div style='background: linear-gradient(135deg, #0a0a0a 0%, #1a1a1a 100%); padding: 8px 15px; border-radius: 20px; border: 2px solid " + _relColor + "; box-shadow: 0 0 10px " + _relColor + "44;'><span style='color: " + _relColor + "; font-weight: bold; font-size: 16px;'>Level " + _rel.level + "</span></div></div><div style='background-color: #0a0a0a; border-radius: 10px; height: 12px; overflow: hidden; border: 1px solid #444; margin-top: 10px; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);'><div style='background: linear-gradient(90deg, " + _relColor + " 0%, " + _relColor + "dd 100%); height: 100%; width: " + _xpPercent + "%; transition: width 0.3s ease; box-shadow: 0 0 10px " + _relColor + ";'></div></div>"` "RelationshipDetail">> <<set $viewingNPC = _npcName>> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- BACK BUTTON --> <div style="margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Return to Game</div>">> <<if $lastLocation && $lastLocation !== "">> <<goto $lastLocation>> <<else>> <<goto "Alleyway">> <</if>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$viewingNPC || !$relationships[$viewingNPC]>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">Error: NPC not found</h1> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Back to Relationships</div>" "Relationships">> <<set $viewingNPC = null>> <</link>> </div> </div> <<else>> <<set _npc = setup.getNPCByName($viewingNPC)>> <<set _rel = $relationships[$viewingNPC]>> <<set _relColor = setup.getRelationshipColor(_rel.level)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div @style="'padding: 20px; background: linear-gradient(135deg, ' + _relColor + ' 0%, ' + _relColor + 'aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid ' + _relColor + '; box-shadow: 0 0 20px ' + _relColor + '66;'"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);"><<print $viewingNPC>></h1> </div> <!-- Relationship Status Card --> <div @style="'background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid ' + _relColor + '; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px ' + _relColor + '44; margin-bottom: 20px;'"> <h2 @style="'color: ' + _relColor + '; margin: 0 0 15px 0; text-shadow: 0 0 10px ' + _relColor + '88;'">Relationship Status</h2> <div style="background-color: #0a0a0a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"> <span style="color: #fff; font-weight: bold; font-size: 18px;">Level <<print _rel.level>></span> <<if _rel.level < 5>> <<set _nextThreshold = [25, 75, 175, 425][_rel.level - 1]>> <<set _currentLevelMin = [0, 25, 75, 175][_rel.level - 1]>> <<set _xpInLevel = _rel.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <span @style="'color: ' + _relColor + '; font-weight: bold; font-size: 18px;'"><<print _xpInLevel>> / <<print _xpNeededForLevel>> XP</span> <<else>> <span @style="'color: ' + _relColor + '; font-weight: bold; font-size: 18px;'">MAX LEVEL</span> <</if>> </div> <<if _rel.level < 5>> <!-- XP Progress Bar --> <div @style="'background-color: #000; border-radius: 10px; height: 25px; overflow: hidden; border: 2px solid ' + _relColor + '; box-shadow: inset 0 2px 4px rgba(0,0,0,0.8); position: relative;'"> <div @style="'background: linear-gradient(90deg, ' + _relColor + ' 0%, ' + _relColor + 'dd 100%); height: 100%; width: ' + _xpPercent + '%; transition: width 0.3s ease; box-shadow: 0 0 15px ' + _relColor + '; position: relative; overflow: hidden;'"> <<if _xpPercent > 0>> <div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.3) 50%, transparent 100%); background-size: 200% 100%; animation: shimmer 2s infinite;"></div> <</if>> </div> </div> <p style="color: #aaa; margin: 10px 0 0 0; font-size: 14px;"> <<print _nextThreshold - _rel.points>> XP until next level </p> <<else>> <p style="color: #ff6b9d; margin: 10px 0 0 0; font-size: 14px; font-weight: bold;"> 💕 Maximum relationship level! </p> <</if>> </div> </div> <!-- NPC Information Card --> <<if _npc>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">Character Information</h2> <!-- Basic Info with Image --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: flex; gap: 20px; align-items: flex-start;"> <!-- Stats Grid --> <div style="flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 15px; color: #e0e0e0; font-size: 15px;"> <div> <strong style="color: #4dabf7;">Job:</strong><br> <<print _npc.jobs && _npc.jobs.length > 0 ? _npc.jobs.join(", ") : "Unemployed">> </div> <div> <strong style="color: #4dabf7;">Gender:</strong><br> <<print _npc.bodyParts.gender.charAt(0).toUpperCase() + _npc.bodyParts.gender.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Age:</strong><br> <<print _npc.appearance.age>> </div> <div> <strong style="color: #4dabf7;">Skin Tone:</strong><br> <<print _npc.appearance.skinTone.charAt(0).toUpperCase() + _npc.appearance.skinTone.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Hair:</strong><br> <<print _npc.appearance.hairLength ? (_npc.appearance.hairLength.charAt(0).toUpperCase() + _npc.appearance.hairLength.slice(1)) : "Unknown">> <<print _npc.appearance.hairColor>> </div> <div> <strong style="color: #4dabf7;">Build:</strong><br> <<print _npc.appearance.physique.charAt(0).toUpperCase() + _npc.appearance.physique.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Chest:</strong><br> <<print _npc.bodyParts.chest.charAt(0).toUpperCase() + _npc.bodyParts.chest.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Butt:</strong><br> <<print _npc.bodyParts.butt.charAt(0).toUpperCase() + _npc.bodyParts.butt.slice(1)>> </div> <div style="grid-column: 1 / -1;"> <strong style="color: #4dabf7;">Genitals:</strong><br> <<print (_npc.bodyParts.genitals || "Unknown").charAt(0).toUpperCase() + (_npc.bodyParts.genitals || "Unknown").slice(1)>> </div> </div> <!-- NPC Image --> <<if $imageSettings.imagesEnabled && $imageSettings.npcImagesEnabled>> <<set _npcImage = setup.getNPCImage(_npc.name)>> <<if _npcImage>> <div style="flex-shrink: 0;"> <img @src="_npcImage" style="max-width: 250px; max-height: 350px; border-radius: 8px; border: 2px solid #4dabf7; box-shadow: 0 0 15px rgba(77,171,247,0.4);" onerror="this.style.display='none';"> </div> <</if>> <</if>> </div> </div> <!-- Stats --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Stats</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; color: #e0e0e0; font-size: 15px;"> <div> <span style="color: #ff6b6b;">■</span> <strong>Strength:</strong> <<print _npc.stats.strength>> </div> <div> <span style="color: #51cf66;">■</span> <strong>Dexterity:</strong> <<print _npc.stats.dexterity>> </div> <div> <span style="color: #ffd43b;">■</span> <strong>Charisma:</strong> <<print _npc.stats.charisma>> </div> <div> <span style="color: #4dabf7;">■</span> <strong>Intelligence:</strong> <<print _npc.stats.intelligence>> </div> </div> </div> <!-- Physical Traits --> <<if _npc.physicalTraits && _npc.physicalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Physical Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _j = 0; _j < _npc.physicalTraits.length; _j++>> <<if _npc.physicalTraits[_j] !== "Short Hair" && _npc.physicalTraits[_j] !== "Long Hair">> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #51cf66; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #51cf66; box-shadow: 0 0 5px #51cf6644;"> <<print _npc.physicalTraits[_j]>> </span> <</if>> <</for>> </div> </div> <</if>> <!-- Mental Traits --> <<if _npc.mentalTraits && _npc.mentalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Mental Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _j = 0; _j < _npc.mentalTraits.length; _j++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #9b59b6; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #9b59b6; box-shadow: 0 0 5px #9b59b644;"> <<print _npc.mentalTraits[_j]>> </span> <</for>> </div> </div> <</if>> <!-- Skills --> <<if _npc.skills && _npc.skills.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Skills</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _j = 0; _j < _npc.skills.length; _j++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ffd43b; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #ffd43b; box-shadow: 0 0 5px #ffd43b44;"> <<print _npc.skills[_j]>> </span> <</for>> </div> </div> <</if>> </div> <</if>> <!-- Current Location (Level 3+) --> <<if _rel.level >= 3>> <<set _currentDay = $dayOfWeek || "Monday">> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <<set _npcLocation = setup.getNPCLocation(_npc, _currentDay, _currentHour)>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">📍 Current Location</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <<if _npcLocation>> <div style="color: #e0e0e0; font-size: 16px; text-align: center;"> <span style="color: #51cf66; font-weight: bold; font-size: 18px;"> <<print _npcLocation.replace(/([A-Z])/g, ' $1').trim()>> </span> </div> <div style="color: #aaa; font-size: 14px; text-align: center; margin-top: 8px;"> As of <<print _currentDay>>, <<print _currentHour>>:00 </div> <<else>> <div style="color: #ff6b6b; font-size: 16px; text-align: center;"> Location unknown </div> <</if>> </div> <p style="color: #aaa; margin: 10px 0 0 0; font-size: 13px; font-style: italic; text-align: center;"> You know where they are! </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Back to Relationships</div>" "Relationships">> <<set $viewingNPC = null>> <</link>> </div> </div> <</if>> <</nobr>> <style> @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } </style>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #667eeaaa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 0 20px #667eea66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🚿 Locker Room</h1> </div> <!-- Shower Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #667eea; margin: 0 0 15px 0;">💧 Shower</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6; margin: 0;"> The locker room is clean and well-maintained. Rows of lockers line the walls, and you can hear the sound of running water from the shower stalls. </p> </div> <span id="showerMessage"></span> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🚿 Take a Shower</div>">> <<replace "#showerMessage">> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0; text-align: center;"> ✨ You take a refreshing shower and feel clean and rejuvenated! </p> </div> <</replace>> <</link>> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #e91e63aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63; box-shadow: 0 0 20px #e91e6366;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">👥 Gym Floor</h1> </div> <!-- Empty State --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">🏋️</div> <h2 style="color: #e91e63; margin: 0 0 15px 0;">Nobody Around Right Now</h2> <p style="color: #aaa; font-size: 16px; line-height: 1.6; max-width: 500px; margin: 0 auto;"> The gym floor is pretty empty at the moment. You don't see anyone you can chat with right now. Maybe try coming back later? </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💪 Physical Traits</h2> <<if $physicalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Current Traits:</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _i = 0; _i < $physicalTraits.length; _i++>> <<set _currentTrait = $physicalTraits[_i]>> <<if _currentTrait !== "Short Hair" && _currentTrait !== "Long Hair" && (!setup.exclusiveTraitGroups || !setup.exclusiveTraitGroups.voice || !setup.exclusiveTraitGroups.voice.includes(_currentTrait))>> <<capture _i, _currentTrait>> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #51cf66; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #51cf66; box-shadow: 0 0 5px #51cf6644; cursor: pointer;'>" + _currentTrait + " ✕</span>"`>> <<run $physicalTraits.deleteAt(_i)>> <<replace "#physicalTraitsSection">><<include "CheatMenuPhysicalTraits">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Add Trait:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _physicalTraitList = [ "Artistic|INT +2, DEX +2", "Athletic Build|STR +5, DEX +5", "Attractive|CHA +8", "Blemished|CHA -4", "Broad-shouldered|STR +4", "Clumsy|DEX -6", "Curvy|CHA +5", "Customer-Focused|CHA +3, INT +1", "Deep Thinker|INT +4", "Detail-Oriented|INT +3, DEX +2", "Fashionable|CHA +5", "Fast|DEX +6", "Fit|STR +5, DEX +4", "Flexible|DEX +6", "Freckled|CHA +2", "Graceful|DEX +6, CHA +3", "High Energy|DEX +3, CHA +4", "Humorous|CHA +2", "Lean|DEX +4, STR +2", "Mature|INT +4, CHA +2", "Monotone Expression|INT +1", "Muscular|STR +8", "Overweight|STR -4, DEX -4, CHA -3", "Perceptive|INT +3, CHA +1", "Petite|DEX +4", "Pierced|CHA +2", "Plain|CHA -3", "Punctual|INT +1, CHA +1", "Quick|DEX +5", "Quick Reflexes|DEX +6", "Relaxed|CHA +2", "Sarcastic|CHA +2, INT +1", "Scarred|STR +2, CHA -3", "Sharp Features|CHA +4", "Short|None", "Slow|DEX -5, STR -2", "Smooth Skin|CHA +3", "Soft|CHA +3", "Stiff|DEX -5", "Strong|STR +7", "Sturdy|STR +4", "Tall|None", "Tattooed|CHA +3", "Tech Savvy|INT +5, DEX +2", "Ugly|CHA -8", "Underweight|STR -5, CHA -2", "Voluptuous|CHA +6", "Weak|STR -7", "Youthful|CHA +3, DEX +2" ]>> <<for _j = 0; _j < _physicalTraitList.length; _j++>> <<set _traitData = _physicalTraitList[_j].split("|")>> <<set _trait = _traitData[0]>> <<set _bonuses = _traitData[1]>> <<set _hasTrait = $physicalTraits.includes(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $physicalTraits)>> <<if !_hasTrait>> <<capture _trait, _conflict, _bonuses>> <<if _conflict>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span><br><span style='font-size: 10px;'>⚠️ Conflicts: " + _conflict + "</span></div>"`>> <<run $physicalTraits.delete(_conflict)>> <<run $physicalTraits.push(_trait)>> <<replace "#physicalTraitsSection">><<include "CheatMenuPhysicalTraits">><</replace>> <</link>> <<else>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<run $physicalTraits.push(_trait)>> <<replace "#physicalTraitsSection">><<include "CheatMenuPhysicalTraits">><</replace>> <</link>> <</if>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #da77f2; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #da77f2; margin: 0 0 15px 0;">🎤 Voice Trait</h2> <<set _currentVoiceTrait = null>> <<for _i = 0; _i < $physicalTraits.length; _i++>> <<if setup.exclusiveTraitGroups.voice.includes($physicalTraits[_i])>> <<set _currentVoiceTrait = $physicalTraits[_i]>> <<break>> <</if>> <</for>> <<if _currentVoiceTrait>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #da77f2; margin: 0 0 10px 0;">Current Voice:</h3> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #da77f2; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #da77f2; box-shadow: 0 0 5px #da77f244; cursor: pointer;'>" + _currentVoiceTrait + " ✕</span>"`>> <<run $physicalTraits.delete(_currentVoiceTrait)>> <<replace "#voiceTraitsSection">><<include "CheatMenuVoiceTraits">><</replace>> <</link>> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #da77f2; margin: 0 0 10px 0;"><<print _currentVoiceTrait ? "Change Voice:" : "Add Voice:">></h3> <p style="color: #ffd43b; font-size: 13px; margin: 0 0 10px 0;">⚠️ Only one voice trait allowed at a time</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _voiceTraitList = [ "Animated Tone|CHA +4", "Articulate Speech|CHA +4, INT +3", "Balanced Neutral Tone|None", "Bouncy Tone|CHA +3", "Breathy Voice|CHA +2", "Calm Voice|CHA +3", "Charming Tone|CHA +5", "Choppy Speech|CHA -2", "Clear Enunciation|CHA +3, INT +2", "Clear Pronunciation|CHA +3, INT +2", "Croaky Voice|CHA -2", "Deadpan Delivery|INT +2, CHA -2", "Deep Voice|CHA +2", "Detached Voice|CHA -3", "Eager Tone|CHA +3", "Emotionless Tone|CHA -4", "Even-Paced Voice|CHA +2", "Expressive Voice|CHA +5", "Fast Talker|DEX +2, CHA -1", "Flat Voice|CHA -2", "Friendly Tone|CHA +4", "Gentle Voice|CHA +3", "Gravelly Voice|CHA +1", "Grim Tone|CHA -2", "High-Pitched Tone|CHA -1", "Hushed Intimate Voice|CHA +4", "Interruptive Tone|CHA -3", "Lazy Drawl|CHA -2", "Lively Tone|CHA +4", "Measured Speech|INT +3", "Melodic Voice|CHA +5", "Monotone|CHA -3", "Mumbly Voice|CHA -4", "Nasally Tone|CHA -3", "Pleasant Cadence|CHA +4", "Rapid-Fire Speech|DEX +3, CHA -2", "Raspy Voice|None", "Robotic Tone|INT +2, CHA -3", "Shaky Voice|CHA -3", "Sharp Voice|CHA -1", "Silky Voice|CHA +5", "Sing-Songy Voice|CHA +3", "Slow Calm Voice|CHA +2", "Smooth Talker|CHA +6", "Smooth Voice|CHA +4", "Snappy Tone|CHA -2", "Soft Monologue Style|CHA +2", "Soft-Spoken|CHA +2", "Soothing Tone|CHA +4", "Steady Voice|CHA +3", "Stoic Tone|INT +2, CHA -1", "Stuttering Speech|CHA -3", "Understated Voice|CHA +1", "Warm Tone|CHA +5" ]>> <<for _j = 0; _j < _voiceTraitList.length; _j++>> <<set _traitData = _voiceTraitList[_j].split("|")>> <<set _trait = _traitData[0]>> <<set _bonuses = _traitData[1]>> <<set _hasTrait = $physicalTraits.includes(_trait)>> <<if !_hasTrait>> <<capture _trait, _bonuses>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<if _currentVoiceTrait>> <<run $physicalTraits.delete(_currentVoiceTrait)>> <</if>> <<run $physicalTraits.push(_trait)>> <<replace "#voiceTraitsSection">><<include "CheatMenuVoiceTraits">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">🧠 Mental Traits</h2> <<if $mentalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Current Traits:</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _i = 0; _i < $mentalTraits.length; _i++>> <<set _currentTrait = $mentalTraits[_i]>> <<capture _i, _currentTrait>> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #9b59b6; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #9b59b6; box-shadow: 0 0 5px #9b59b644; cursor: pointer;'>" + _currentTrait + " ✕</span>"`>> <<run $mentalTraits.deleteAt(_i)>> <<replace "#mentalTraitsSection">><<include "CheatMenuMentalTraits">><</replace>> <</link>> <</capture>> <</for>> </div> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Add Trait:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _mentalTraitList = [ "Aggressive|STR +5, CHA -2", "Alluring|CHA +7", "Ambitious|INT +4, CHA +3", "Analytical|INT +5", "Arrogant|CHA -6, INT -2", "Awkward|CHA -4", "Bimbo|INT -50, CHA +35", "Bitchy|CHA -5, INT -2", "Blunt|CHA -2, INT +2", "Bookworm|INT +6", "Brave|STR +4, CHA +3", "Calm|INT +2, CHA +2", "Charming|CHA +6", "Chill|CHA +3, INT +2", "Clingy|CHA -3", "Cold|CHA -5", "Complacent|INT -4, STR -3", "Competitive|STR +3, INT +2", "Confident|CHA +6", "Considerate|CHA +5", "Corporate Drone|INT +2, CHA -2", "Cowardly|STR -5, CHA -4", "Crafty|INT +4, DEX +3", "Creative|INT +5", "Cruel|CHA -8, INT -2", "Curious|INT +3", "Customer-Focused|CHA +4, INT +2", "Cynical|INT +2, CHA -3", "Deceitful|CHA -5, INT -2", "Determined|STR +4, INT +2", "Detail-Oriented|INT +5", "Diplomatic|CHA +5, INT +3", "Direct|CHA +2, INT +1", "Disciplined|STR +3, INT +3", "Disorganized|INT -4, DEX -2", "Diva|CHA +6, INT -3", "Dominant|CHA +4, STR +3", "Dull|INT -6, CHA -3", "Efficient|INT +4, DEX +2", "Empathetic|CHA +5, INT +2", "Energetic|DEX +2, CHA +2", "Erratic|CHA -4, INT -3", "Extroverted|CHA +5", "Femboy|CHA +4, DEX +3", "Flirty|CHA +5", "Focused|INT +4", "Foolish|INT -7, CHA -2", "Forgetful|INT -5", "Friendly|CHA +6", "Funny|CHA +5", "Geek|INT +5, CHA -1", "Goth|CHA +2, INT +2", "Hardworking|STR +3, INT +3", "High Stamina|STR +6, DEX +3", "Honest|CHA +3, INT -2", "Humble|CHA +4", "Immature|INT -4, CHA -3", "Impatient|INT -3, CHA -4", "Impulsive|DEX +3, INT -3", "Insecure|CHA -5", "Insensitive|CHA -5", "Intelligent|INT +5", "Introverted|INT +3, CHA -3", "Jealous|CHA -5, INT -2", "Jock|STR +5, DEX +4, INT -2", "Kind|CHA +6", "Lazy|STR -5, INT -4", "Logical|INT +6", "Loyal|CHA +4", "Lucky|CHA +3, DEX +3", "Moody|CHA -3", "Negotiator|CHA +6, INT +3", "Nerd|INT +6, CHA -2", "Nonchalant|CHA +2", "Obsessive|INT -3, CHA -4", "Optimistic|CHA +4", "Organized|INT +4", "Outgoing|CHA +4", "Overthinker|INT +3, CHA -3", "Paranoid|INT +2, CHA -4", "Passive|CHA -2, INT +3", "Patient|INT +3, CHA +2", "Perceptive|INT +5", "Perfectionist|INT +4, CHA -2", "Perverted|None", "Pessimistic|INT +3, CHA -3", "Polite|CHA +4", "Prep|CHA +5, INT +2", "Punctual|INT +2", "Quiet|CHA -2, INT +2", "Quick Learner|INT +5", "Reassuring|CHA +4", "Reckless|INT -4, STR -3", "Resourceful|INT +5, DEX +2", "Risk Taker|STR +3, INT -2", "Rude|CHA -6", "Seductive|CHA +6", "Selfish|CHA -6", "Sensitive|CHA -2, INT +2", "Short Tempered|CHA -5, INT -2", "Shrewd|INT +5, CHA +2", "Shy|CHA -5, INT +2", "Slow Learner|INT -6", "Musky|CHA +2", "Sly|INT +4, CHA +2", "Steadfast|STR +3, INT +2", "Stubborn|STR +4, INT -2", "Submissive|CHA -3, DEX +2", "Supportive|CHA +5", "Talkative|CHA +3", "Tease|CHA +2", "Thoughtful|INT +3", "Tomboy|STR +3, DEX +3, CHA -2", "Tone Deaf|CHA -3", "Trusting|CHA +3", "Unskilled|DEX -5, INT -3", "Unlucky|CHA -3, DEX -3", "Unpredictable|CHA -2", "Unreliable|CHA -5, INT -3", "Warm|CHA +5", "Wise|INT +7", "Witty|CHA +3, INT +2", "Workaholic|INT +3, STR +2" ]>> <<for _j = 0; _j < _mentalTraitList.length; _j++>> <<set _traitData = _mentalTraitList[_j].split("|")>> <<set _trait = _traitData[0]>> <<set _bonuses = _traitData[1]>> <<set _hasTrait = $mentalTraits.includes(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $mentalTraits)>> <<if !_hasTrait>> <<capture _trait, _conflict, _bonuses>> <<if _conflict>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span><br><span style='font-size: 10px;'>⚠️ Conflicts: " + _conflict + "</span></div>"`>> <<run $mentalTraits.delete(_conflict)>> <<run $mentalTraits.push(_trait)>> <<replace "#mentalTraitsSection">><<include "CheatMenuMentalTraits">><</replace>> <</link>> <<else>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<run $mentalTraits.push(_trait)>> <<replace "#mentalTraitsSection">><<include "CheatMenuMentalTraits">><</replace>> <</link>> <</if>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff922b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff922b; margin: 0 0 15px 0;">⚡ Skills</h2> <<if $skills.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff922b; margin: 0 0 10px 0;">Current Skills:</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _i = 0; _i < $skills.length; _i++>> <<set _currentSkill = $skills[_i]>> <<if _currentSkill !== "BtestBraitBeesBigBeenore" && _currentSkill !== "Sunfish" && _currentSkill !== "Occult Expert">> <<capture _i, _currentSkill>> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ff922b; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #ff922b; box-shadow: 0 0 5px #ff922b44; cursor: pointer;'>" + _currentSkill + " ✕</span>"`>> <<run $skills.deleteAt(_i)>> <<replace "#skillsSection">><<include "CheatMenuSkills">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff922b; margin: 0 0 10px 0;">Add Skill:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _skillList = [ "Accounting|INT +6", "Acting|CHA +6, INT +2", "Art|DEX +4, INT +3", "Athletics|STR +5, DEX +4", "Baking|DEX +4, INT +2", "Cleaning|DEX +3", "Coding|INT +6", "Combat|STR +6, DEX +3", "Construction|STR +5, INT +2", "Cooking|INT +3, DEX +2", "Customer Service|CHA +3, INT +1", "Dancing|DEX +5, CHA +3", "Driving|DEX +4", "First Aid|INT +4", "Foreign Language|INT +5", "Forklift Certified|DEX +3, STR +2", "Gardening|INT +2, STR +2", "Guitar|DEX +4, CHA +2", "Hair Styling|DEX +5, CHA +2", "Heavy Lifting|STR +7", "High Heels Proficient|DEX +4, CHA +2", "Inventory Management|INT +3, DEX +1", "Languages|INT +5", "Legal Knowledge|INT +7", "Lock Picking|DEX +6, INT +2", "Maid|DEX +4", "Makeup|DEX +3, CHA +3", "Management|INT +5, CHA +4", "Martial Arts|STR +5, DEX +5", "Math Skills|INT +5", "Medicine|INT +7", "Modeling|CHA +6", "Music|DEX +3, CHA +4", "Painting|DEX +4, INT +3", "Persuasion|CHA +7", "Photography|INT +3, CHA +2", "Piano|DEX +5, INT +2", "Plumbing|STR +3, INT +2", "Product Knowledge|INT +2, CHA +1", "Public Speaking|CHA +6, INT +2", "Retail|CHA +3, INT +2", "Sales|CHA +6, INT +2", "Serving|CHA +4, DEX +2", "Sexually Skilled|CHA +5, DEX +2", "Singing|CHA +5", "Social Media|CHA +5, INT +2", "Stealth|DEX +6", "Swimmer|STR +4, DEX +3", "Swimming|STR +4, DEX +3", "Teaching|INT +5, CHA +3", "Tech-Savvy|INT +3, DEX +1", "Trading|CHA +4, INT +3", "Troubleshooting|INT +3, DEX +2", "Writing|INT +5", "Yoga|DEX +5, INT +2" ]>> <<for _j = 0; _j < _skillList.length; _j++>> <<set _skillData = _skillList[_j].split("|")>> <<set _skill = _skillData[0]>> <<set _bonuses = _skillData[1]>> <<set _hasSkill = $skills.includes(_skill)>> <<if !_hasSkill>> <<capture _skill, _bonuses>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff922b; color: #ff922b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _skill + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<run $skills.push(_skill)>> <<replace "#skillsSection">><<include "CheatMenuSkills">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubVIP">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700; box-shadow: 0 0 20px #FFD70066;"> <h1 style="color: #000; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(255,255,255,0.3);">👑 VIP Lounge</h1> </div> <!-- Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6; margin: 0;"> The VIP lounge is dimly lit with luxurious velvet seating and ambient purple lighting. Soft music plays in the background as exclusive guests enjoy premium bottle service and private entertainment. Everything here exudes opulence and discretion. </p> </div> <!-- Available Strippers --> <<set _strippers = setup.getNPCsByJob("Stripper")>> <<if _strippers && _strippers.length > 0>> <h2 style="color: #FFD700; margin-bottom: 15px;">💃 Available Performers</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9D00FF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _strippers>> <<capture _npc>> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9D00FF; margin: 0 0 10px 0;"><<= _npc.name>></h3> <!-- Service Options --> <div style="background: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <p style="color: #FFD700; font-size: 16px; font-weight: bold; margin: 0 0 8px 0;">Private Dance: $500</p> <p style="color: #aaa; font-size: 13px; margin: 0; line-height: 1.4;">An intimate, personal performance just for you.</p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px;"> <<if $money >= 500>> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>💃 Private Dance</div>">> <<set $money -= 500>> <<set $currentVIPStriper = _npc>> <<goto "StripClubVIPService">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed; font-size: 13px;'>💃 Private Dance</div> <</if>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>💬 Chat</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #FFD700; margin-bottom: 15px;">💃 Available Performers</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No performers are available right now. Check back later. </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Main Floor</div>" "StripClub">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #e91e63; margin: 0 0 15px 0;">💕 NPC Relationships</h2> <!-- NPC List --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333; max-height: 500px; overflow-y: auto;"> <<if Object.keys($relationships).length === 0>> <p style="color: #999; font-style: italic; margin: 0; text-align: center; padding: 20px;">No NPC relationships initialized yet</p> <<else>> <<set _hasMetNPCs = false>> <<set _relationshipKeys = Object.keys($relationships)>> <<for _i = 0; _i < _relationshipKeys.length; _i++>> <<set _npcName = _relationshipKeys[_i]>> <<set _rel = $relationships[_npcName]>> <<if $metNPCs.includes(_npcName)>> <<set _hasMetNPCs = true>> <<capture _npcName, _rel>> <<set _relColor = setup.getRelationshipColor(_rel.level)>> <div @style="'background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 12px; border: 2px solid ' + _relColor + '; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'"> <!-- NPC Header --> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;"> <strong @style="'color: ' + _relColor + '; font-size: 18px;'"><<print _npcName>></strong> <span @style="'color: #fff; font-size: 14px; background: #0a0a0a; padding: 6px 12px; border-radius: 6px; border: 1px solid ' + _relColor + ';'"> Level <<print _rel.level>> (<<print _rel.points>> points) </span> </div> <!-- XP Progress Bar --> <div style="margin-bottom: 12px;"> <<if _rel.level < 5>> <<set _nextThreshold = [25, 75, 175, 425][_rel.level - 1]>> <<set _currentLevelMin = [0, 25, 75, 175][_rel.level - 1]>> <<set _xpInLevel = _rel.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <div style="display: flex; justify-content: space-between; font-size: 13px; color: #e0e0e0; margin-bottom: 6px; font-weight: bold;"> <span>Experience: <<print _xpInLevel>> / <<print _xpNeededForLevel>></span> <span><<print _xpPercent>>%</span> </div> <div style="background: #0a0a0a; border-radius: 6px; height: 12px; overflow: hidden; border: 1px solid #444;"> <div @style="'background: ' + _relColor + '; height: 100%; width: ' + _xpPercent + '%; transition: width 0.3s;'"></div> </div> <<else>> <div style="text-align: center; font-size: 14px; color: #51cf66; font-weight: bold;"> MAX LEVEL REACHED </div> <</if>> </div> <!-- Points Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10 Points</div>">> <<run setup.addRelationshipPoints(_npcName, 10)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+50 Points</div>">> <<run setup.addRelationshipPoints(_npcName, 50)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Max Level</div>">> <<run setup.addRelationshipPoints(_npcName, 1000)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> </div> <!-- Control Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to Level 1</div>">> <<set $relationships[_npcName] = { level: 1, points: 0 }>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Complete Reset</div>">> <<set $relationships[_npcName] = { level: 1, points: 0 }>> <<run $metNPCs.delete(_npcName)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> </div> </div> <</capture>> <</if>> <</for>> <<if !_hasMetNPCs>> <p style="color: #999; font-style: italic; margin: 0; text-align: center; padding: 20px;">No NPCs met yet. Explore the world to meet characters!</p> <</if>> <</if>> </div> <!-- Global Relationship Controls --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #e91e63; margin: 0 0 12px 0;">Global Controls</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✨ Max All Relationships</div>">> <<set _allRelKeys = Object.keys($relationships)>> <<for _j = 0; _j < _allRelKeys.length; _j++>> <<set _npcName2 = _allRelKeys[_j]>> <<if $metNPCs.includes(_npcName2)>> <<run setup.addRelationshipPoints(_npcName2, 1000)>> <</if>> <</for>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔄 Reset All Relationships</div>">> <<set _resetKeys = Object.keys($relationships)>> <<for _k = 0; _k < _resetKeys.length; _k++>> <<set _npcName3 = _resetKeys[_k]>> <<set $relationships[_npcName3] = { level: 1, points: 0 }>> <</for>> <<set $metNPCs = []>> <<set $dailyConversations = {}>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF; box-shadow: 0 0 20px #9D00FF66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">💃 Private Dance</h1> </div> <!-- Service Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #9D00FF; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">💜</div> <h2 style="color: #9D00FF; margin: 0 0 15px 0;"><<= $currentVIPStriper.name>> provides an unforgettable experience</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> In the privacy of the VIP lounge, <<= $currentVIPStriper.name>> performs an intimate and captivating dance just for you. The music pulses, the lights dim, and for these moments, you're the only person in the world. </p> <p style="color: #FFD700; font-size: 20px; font-weight: bold; margin: 0;"> ✨ An experience worth every dollar ✨ </p> </div> <!-- Relationship Gain --> <<run setup.addRelationshipPoints($currentVIPStriper.name, 3)>> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #51cf66; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> 💕 Your relationship with <<= $currentVIPStriper.name>> has improved! (+3 points) </p> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to VIP Lounge</div>">> <<run advanceTime(30)>> <<set $currentVIPStriper = null>> <<goto "StripClubVIP">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize dance progress if needed --> <<if !$danceProgress>> <<set $danceProgress = 0>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b9d; box-shadow: 0 0 20px #ff6b9d66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🩰 Group Dance Lesson</h1> </div> <!-- Lesson Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">💃</div> <h2 style="color: #ff6b9d; margin: 0 0 15px 0;">A Graceful Session</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> You spend an hour learning choreography and practicing your movements. The instructor guides the group through various steps and techniques, helping you develop your coordination and grace. </p> </div> <!-- Stat Gain --> <<set $stats.dexterity += 1>> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #51cf66; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> 💪 +1 Dexterity! </p> </div> <!-- Dancer Trait Progress --> <<if $skills.includes("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 0;"> ⭐ You already have the Dancing skill! </p> </div> <<else>> <<set _danceChance = random(1, 100)>> <<if _danceChance <= 3>> <<run $skills.push("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 Congratulations! You've learned the Dancing skill! </p> </div> <<else>> <<set $danceProgress += 1>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ff6b9d;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0; text-align: center;">🎯 Dancing Skill Progress</h3> <p style="color: #e0e0e0; text-align: center; margin: 0 0 15px 0;">Keep practicing! You're getting closer to mastering dance.</p> <div style="background: #0a0a0a; border-radius: 6px; padding: 10px; border: 1px solid #444;"> <p style="color: #aaa; font-size: 14px; margin: 0; text-align: center;"> Sessions completed: <span style="color: #ff6b9d; font-weight: bold;"><<= $danceProgress>></span> </p> <p style="color: #aaa; font-size: 13px; margin: 5px 0 0 0; text-align: center; font-style: italic;"> (3% chance per session with group lessons) </p> </div> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Studio</div>">> <<run advanceTime(60)>> <<goto "DanceStudio">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize coach sessions if needed --> <<if !$danceCoachSessions>> <<set $danceCoachSessions = 0>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700; box-shadow: 0 0 20px #FFD70066;"> <h1 style="color: #000; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(255,255,255,0.3);">👥 Private Coaching Session</h1> </div> <!-- Lesson Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">🌟</div> <h2 style="color: #FFD700; margin: 0 0 15px 0;">Intensive One-on-One Training</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> Your private coach dedicates their full attention to refining your technique. Every movement is analyzed and perfected, pushing your abilities to new heights. The personalized instruction accelerates your progress dramatically. </p> </div> <!-- Stat Gain --> <<set $stats.dexterity += 5>> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #51cf66; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> 💪 +5 Dexterity! </p> </div> <!-- Dancer Trait Progress --> <<if $skills.includes("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 0;"> ⭐ You've already mastered the Dancing skill! </p> </div> <<else>> <<set $danceCoachSessions += 1>> <<if $danceCoachSessions >= 3>> <<run $skills.push("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 64px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 22px; font-weight: bold; margin: 0 0 10px 0;"> 🎉 Mastery Achieved! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 0;"> You've learned the Dancing skill through dedicated coaching! </p> </div> <<else>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700;"> <h3 style="color: #FFD700; margin: 0 0 10px 0; text-align: center;">🎯 Coaching Progress</h3> <p style="color: #e0e0e0; text-align: center; margin: 0 0 15px 0;">Your coach is guiding you toward mastery!</p> <div style="background: #0a0a0a; border-radius: 6px; padding: 15px; border: 1px solid #444;"> <div style="margin-bottom: 10px;"> <p style="color: #aaa; font-size: 14px; margin: 0; text-align: center;"> Coaching sessions: <span style="color: #FFD700; font-weight: bold; font-size: 18px;"><<= $danceCoachSessions>> / 3</span> </p> </div> <div style="background: #000; border-radius: 6px; height: 12px; overflow: hidden; border: 1px solid #444;"> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); height: 100%; width: <<= Math.floor(($danceCoachSessions / 3) * 100)>>%; transition: width 0.3s;"></div> </div> <p style="color: #51cf66; font-size: 13px; margin: 10px 0 0 0; text-align: center; font-weight: bold;"> <<= 3 - $danceCoachSessions>> more session<<if 3 - $danceCoachSessions !== 1>>s<</if>> until mastery! </p> </div> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Studio</div>">> <<run advanceTime(60)>> <<goto "DanceStudio">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8d6e63; box-shadow: 0 0 20px #8d6e6366;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">☕ Premium Coffee</h1> </div> <!-- Coffee Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #8d6e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">☕</div> <h2 style="color: #8d6e63; margin: 0 0 15px 0;">A Perfect Cup</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> The barista hands you a perfectly crafted cup of coffee. The rich, smooth taste energizes you instantly. You feel ready to take on whatever comes next. </p> </div> <!-- Trait Chance --> <<set _traitRoll = random(1, 100)>> <<if _traitRoll <= 1>> <<if !$mentalTraits.includes("Energetic") && !$mentalTraits.includes("Fast")>> <<set _gainedTrait = either("Energetic", "Fast")>> <<if _gainedTrait === "Energetic">> <<run $mentalTraits.push("Energetic")>> <<else>> <<run $physicalTraits.push("Fast")>> <</if>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 The coffee has awakened something in you! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 10px 0 0 0;"> You've gained the <<= _gainedTrait>> trait! </p> </div> <<elseif $mentalTraits.includes("Energetic") && !$physicalTraits.includes("Fast")>> <<run $physicalTraits.push("Fast")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 The coffee has awakened something in you! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 10px 0 0 0;"> You've gained the Fast trait! </p> </div> <<elseif !$mentalTraits.includes("Energetic") && $physicalTraits.includes("Fast")>> <<run $mentalTraits.push("Energetic")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 The coffee has awakened something in you! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 10px 0 0 0;"> You've gained the Energetic trait! </p> </div> <<else>> <div style="background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #4dabf7; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> ☕ You already have both the Energetic and Fast traits! </p> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Cafe</div>">> <<run advanceTime(15)>> <<goto "Cafe">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66; box-shadow: 0 0 20px #51cf6666;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🎉 Congratulations!</h1> </div> <!-- Hiring Message --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">☕</div> <h2 style="color: #51cf66; margin: 0 0 15px 0;">Welcome to Manta Ray Cafe!</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> The manager reviews your application and smiles. "Your skills are exactly what we're looking for! Welcome to the team. You'll be making $13 per hour. Come back during work hours to start your shift." </p> <p style="color: #ffd43b; font-size: 16px; font-weight: bold; margin: 0;"> 💰 Hourly Pay: $13 </p> </div> <!-- Job Details --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">📋 Job Information</h3> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #e0e0e0; margin: 0 0 10px 0;"><strong style="color: #4dabf7;">Position:</strong> Barista</p> <p style="color: #e0e0e0; margin: 0 0 10px 0;"><strong style="color: #4dabf7;">Work Hours:</strong> 7:00 AM - 3:00 PM</p> <p style="color: #e0e0e0; margin: 0;"><strong style="color: #4dabf7;">Location:</strong> Manta Ray Cafe</p> </div> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>Start Your New Job!</div>">> <<goto "Cafe">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🖼️ Image Settings</h1> <!-- Default Images & Face Set Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.imagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.imagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <!-- Default Images Toggle --> <h2 style="color: <<if $imageSettings.imagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.imagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 📷 Default Images: <<if $imageSettings.imagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.imagesEnabled>> Default game images are currently shown. Disable them to use custom images instead. <<else>> Default images are hidden. You can now upload custom images below. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 25px;"> <<if $imageSettings.imagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Default Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Default Images</div>">> <<set $imageSettings.imagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.imagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Default Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Default Images</div>">> <<set $imageSettings.imagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> <!-- Face Image Set Toggle (shown when default images enabled) --> <<if $imageSettings.imagesEnabled>> <div style="border-top: 2px solid #333; padding-top: 20px;"> <h3 style="color: <<if $imageSettings.useAltFaces>>#4dabf7<<else>>#ffd43b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.useAltFaces>>#4dabf788<<else>>#ffd43b88<</if>>;"> 🎨 Face Image Set: <<if $imageSettings.useAltFaces>>Alternative<<else>>Original<</if>> </h3> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.useAltFaces>> Using the alternative face image set with organized folder structure. <<else>> Using the original face image set. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if !$imageSettings.useAltFaces>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd43b; color: #ffd43b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ffd43b66, inset 0 0 20px #ffd43b22;'> 📁 Use Original Faces <span style="color: #ffd43b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>📁 Use Original Faces</div>">> <<set $imageSettings.useAltFaces = false>> <<goto "ImageSettings">> <</link>> <</if>> <<if $imageSettings.useAltFaces>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #4dabf766, inset 0 0 20px #4dabf722;'> ✨ Use Alternative Faces <span style="color: #4dabf7; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✨ Use Alternative Faces</div>">> <<set $imageSettings.useAltFaces = true>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <</if>> </div> <!-- Location Images Toggle --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.locationImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.locationImagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $imageSettings.locationImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.locationImagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 🗺️ Location Images: <<if $imageSettings.locationImagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.locationImagesEnabled>> Location images are displayed at the top of area passages. Disable them for a text-only experience. <<else>> Location images are hidden. Enable them to see visuals for each area you visit. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.locationImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Location Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Location Images</div>">> <<set $imageSettings.locationImagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.locationImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Location Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Location Images</div>">> <<set $imageSettings.locationImagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- NPC Images Toggle --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.npcImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.npcImagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $imageSettings.npcImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.npcImagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 👥 NPC Images: <<if $imageSettings.npcImagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.npcImagesEnabled>> NPC character images are displayed when interacting with characters. Disable them to hide all NPC portraits. <<else>> NPC images are hidden. Enable them to see character portraits during interactions. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.npcImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable NPC Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable NPC Images</div>">> <<set $imageSettings.npcImagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.npcImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable NPC Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable NPC Images</div>">> <<set $imageSettings.npcImagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- Secretary Job Images Toggle --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.secretaryImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.secretaryImagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $imageSettings.secretaryImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.secretaryImagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 💼 Secretary Job Images: <<if $imageSettings.secretaryImagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 10px;"> Toggle adult content images for the Mayor's Secretary job. </p> <p style="color: #ffc107; font-size: 14px; margin: 0 0 20px 0; font-style: italic;"> ⚠️ Warning: These images contain explicit adult content. </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.secretaryImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Secretary Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Secretary Images</div>">> <<set $imageSettings.secretaryImagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.secretaryImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Secretary Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Secretary Images</div>">> <<set $imageSettings.secretaryImagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- Custom Image Upload Section --> <<if !$imageSettings.imagesEnabled>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44;"> <h2 style="color: #667eea; margin: 0 0 15px 0; text-shadow: 0 0 10px #667eea88;">📤 Upload Custom Images</h2> <p style="color: #4dabf7; background: #1f2a3a; padding: 15px; border-radius: 8px; border: 2px solid #4dabf7; margin-bottom: 20px;"> ℹ️ <strong>Note:</strong> Upload images from your device or enter a URL. Uploaded images are stored in your browser and will persist across sessions. </p> <!-- Face Image --> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #9b59b6;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">😊 Face Image</h3> <<if $imageSettings.customImages.face>> <div style="margin-bottom: 15px; text-align: center;"> <img @src="$imageSettings.customImages.face" style="max-width: 300px; max-height: 300px; border-radius: 8px; border: 2px solid #9b59b6;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #3a2a3a; border-radius: 8px; color: #ff6b6b;"> ❌ Failed to load image </div> </div> <p style="color: #51cf66; margin-bottom: 10px;">✓ Custom face image set</p> <<else>> <p style="color: #aaa; margin-bottom: 10px; font-style: italic;">No custom face image set</p> <</if>> <!-- File Upload --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Upload from Device:</strong></label> <input type="file" id="faceImageFile" accept="image/*" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #9b59b6; border-radius: 6px; font-size: 14px; margin-bottom: 15px; cursor: pointer;"> <div style="text-align: center; margin: 15px 0; color: #666;">OR</div> <!-- URL Input --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Image URL:</strong></label> <input type="text" id="faceImageInput" placeholder="https://example.com/face.webp" @value="$imageSettings.customImages.face || ''" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #9b59b6; border-radius: 6px; font-size: 14px; margin-bottom: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;' onclick=" var fileInput = document.getElementById('faceImageFile'); var urlInput = document.getElementById('faceImageInput'); if (fileInput.files && fileInput.files[0]) { var reader = new FileReader(); reader.onload = function(e) { SugarCube.State.variables.imageSettings.customImages.face = e.target.result; SugarCube.Engine.play('ImageSettings'); }; reader.readAsDataURL(fileInput.files[0]); } else if (urlInput.value && (urlInput.value.startsWith('http://') || urlInput.value.startsWith('https://'))) { SugarCube.State.variables.imageSettings.customImages.face = urlInput.value.trim(); SugarCube.Engine.play('ImageSettings'); } "> 💾 Save Face Image </div> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🗑️ Clear</div>">> <<set $imageSettings.customImages.face = "">> <<goto "ImageSettings">> <</link>> </div> </div> <!-- Chest Image --> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">👕 Chest Image</h3> <<if $imageSettings.customImages.chest>> <div style="margin-bottom: 15px; text-align: center;"> <img @src="$imageSettings.customImages.chest" style="max-width: 300px; max-height: 300px; border-radius: 8px; border: 2px solid #51cf66;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #2a3a2a; border-radius: 8px; color: #ff6b6b;"> ❌ Failed to load image </div> </div> <p style="color: #51cf66; margin-bottom: 10px;">✓ Custom chest image set</p> <<else>> <p style="color: #aaa; margin-bottom: 10px; font-style: italic;">No custom chest image set</p> <</if>> <!-- File Upload --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Upload from Device:</strong></label> <input type="file" id="chestImageFile" accept="image/*" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #51cf66; border-radius: 6px; font-size: 14px; margin-bottom: 15px; cursor: pointer;"> <div style="text-align: center; margin: 15px 0; color: #666;">OR</div> <!-- URL Input --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Image URL:</strong></label> <input type="text" id="chestImageInput" placeholder="https://example.com/chest.webp" @value="$imageSettings.customImages.chest || ''" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #51cf66; border-radius: 6px; font-size: 14px; margin-bottom: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;' onclick=" var fileInput = document.getElementById('chestImageFile'); var urlInput = document.getElementById('chestImageInput'); if (fileInput.files && fileInput.files[0]) { var reader = new FileReader(); reader.onload = function(e) { SugarCube.State.variables.imageSettings.customImages.chest = e.target.result; SugarCube.Engine.play('ImageSettings'); }; reader.readAsDataURL(fileInput.files[0]); } else if (urlInput.value && (urlInput.value.startsWith('http://') || urlInput.value.startsWith('https://'))) { SugarCube.State.variables.imageSettings.customImages.chest = urlInput.value.trim(); SugarCube.Engine.play('ImageSettings'); } "> 💾 Save Chest Image </div> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🗑️ Clear</div>">> <<set $imageSettings.customImages.chest = "">> <<goto "ImageSettings">> <</link>> </div> </div> <!-- Butt Image --> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #ffc107;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🍑 Butt Image</h3> <<if $imageSettings.customImages.butt>> <div style="margin-bottom: 15px; text-align: center;"> <img @src="$imageSettings.customImages.butt" style="max-width: 300px; max-height: 300px; border-radius: 8px; border: 2px solid #ffc107;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #3a3020; border-radius: 8px; color: #ff6b6b;"> ❌ Failed to load image </div> </div> <p style="color: #51cf66; margin-bottom: 10px;">✓ Custom butt image set</p> <<else>> <p style="color: #aaa; margin-bottom: 10px; font-style: italic;">No custom butt image set</p> <</if>> <!-- File Upload --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Upload from Device:</strong></label> <input type="file" id="buttImageFile" accept="image/*" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #ffc107; border-radius: 6px; font-size: 14px; margin-bottom: 15px; cursor: pointer;"> <div style="text-align: center; margin: 15px 0; color: #666;">OR</div> <!-- URL Input --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Image URL:</strong></label> <input type="text" id="buttImageInput" placeholder="https://example.com/butt.webp" @value="$imageSettings.customImages.butt || ''" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #ffc107; border-radius: 6px; font-size: 14px; margin-bottom: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style='background: linear-gradient(135deg, #ffc107 0%, #ff9800 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;' onclick=" var fileInput = document.getElementById('buttImageFile'); var urlInput = document.getElementById('buttImageInput'); if (fileInput.files && fileInput.files[0]) { var reader = new FileReader(); reader.onload = function(e) { SugarCube.State.variables.imageSettings.customImages.butt = e.target.result; SugarCube.Engine.play('ImageSettings'); }; reader.readAsDataURL(fileInput.files[0]); } else if (urlInput.value && (urlInput.value.startsWith('http://') || urlInput.value.startsWith('https://'))) { SugarCube.State.variables.imageSettings.customImages.butt = urlInput.value.trim(); SugarCube.Engine.play('ImageSettings'); } "> 💾 Save Butt Image </div> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🗑️ Clear</div>">> <<set $imageSettings.customImages.butt = "">> <<goto "ImageSettings">> <</link>> </div> </div> <!-- Clear All Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🗑️ Clear All Custom Images</div>">> <<set $imageSettings.customImages.face = "">> <<set $imageSettings.customImages.chest = "">> <<set $imageSettings.customImages.butt = "">> <<goto "ImageSettings">> <</link>> </div> </div> <<else>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; text-align: center; font-style: italic; margin: 0;"> Custom image uploads are only available when default images are disabled. </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Casino">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">🎰 Silver Marlin - Casino Staff</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d4af37 0%, #8b7355 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> Professional dealers in crisp uniforms manage the gaming tables with practiced efficiency. They shuffle cards with theatrical flair, spin roulette wheels with perfect timing, and maintain the house edge with unwavering precision. </p> </div> <<set _casinoNPCs = setup.getNPCsByJob("Casino Dealer")>> <<if _casinoNPCs.length > 0>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-top: 20px;"> <<for _i, _npc range _casinoNPCs>> <<if setup.isNPCAvailable(_npc.name)>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🎲 <<print _npc.name>></h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;"> <strong style="color: #ffd700;">Job:</strong> <<if _npc.jobs && _npc.jobs.length > 0>> <<print _npc.jobs.join(", ")>> <<else>> No current position <</if>> </p> <<link "<div style='background: #ffd700; color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Approach</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</if>> <</for>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6; text-align: center;"> <p style="color: #666; font-size: 16px;">No casino staff available at the moment.</p> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Casino">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">🎰 Slot Machines</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d4af37 0%, #8b7355 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> Rows of colorful slot machines line the casino floor, each one flashing and chiming to attract players. Digital screens show tantalizing jackpots while the mechanical whir of spinning reels fills the air. </p> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 30px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6; text-align: center;"> <h2 style="color: #666; margin-bottom: 20px;">🚧 Under Construction 🚧</h2> <p style="color: #888; font-size: 18px; margin-bottom: 10px;">Slot machine gameplay is currently being developed.</p> <p style="color: #666; font-size: 14px;">Check back soon for exciting gambling action!</p> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Casino">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">🎡 Roulette</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d4af37 0%, #8b7355 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> The elegant roulette wheel sits at the center of a green felt table, its alternating red and black pockets gleaming under the casino lights. Players cluster around, placing chips on numbers and colors, waiting for the dealer's practiced spin to determine their fate. </p> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 30px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6; text-align: center;"> <h2 style="color: #666; margin-bottom: 20px;">🚧 Under Construction 🚧</h2> <p style="color: #888; font-size: 18px; margin-bottom: 10px;">Roulette gameplay is currently being developed.</p> <p style="color: #666; font-size: 14px;">Check back soon for the thrill of the wheel!</p> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "SeabassPark">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4a7c2c; text-align: center;">🌳 Seabass Park</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Park.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #4a7c2c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Seabass Park"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #2d5016 0%, #3d6b1f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4a7c2c;"> <p style="color: white; font-size: 18px; margin: 0;"> A sprawling green space in the heart of the business district. Tall trees provide shade over winding pathways, while joggers and dog walkers enjoy the fresh air. Park benches line the paths, and the distant sounds of the city seem muffled here. </p> </div> <h2 style="color: #4a7c2c;">What do you want to do?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Return to Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Park</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Go to Outskirts --> <div style="border: 3px solid #8b4513; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Head to the edge of the city.</p> <<link "<div style='background: #8b4513; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>To Outskirts</div>">> <<goto "Outskirts">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("SeabassPark")>> <h2 style="color: #4a7c2c;">🌳 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a7c2c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #4a7c2c; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #4a7c2c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The park is peaceful and empty right now. Just you and the trees. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "LampreyTomes">> <!-- Check if inventory needs to be refreshed (at noon) --> <<if !$lampreyInventory || setup.shouldRefreshLampreyInventory()>> <<set $lampreyInventory = setup.generateLampreyInventory()>> <<set $lampreyLastRefreshDay = $dayNumber>> <</if>> <div style="background: linear-gradient(135deg, #0a0015 0%, #1a0a2e 50%, #16001e 100%); min-height: 100vh; padding: 20px; box-shadow: inset 0 0 100px rgba(139,0,255,0.3);"> <h1 style="color: #d4b3ff; text-align: center; text-shadow: 0 0 20px rgba(212,179,255,0.8), 0 0 40px rgba(139,0,255,0.5);">📚 Lamprey Tomes</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a0e4e 0%, #6b1e6b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b00ff; box-shadow: 0 0 30px rgba(139,0,255,0.5), inset 0 0 20px rgba(177,156,217,0.2);"> <p style="color: #f0e5ff; font-size: 18px; margin: 0; text-shadow: 0 0 10px rgba(240,229,255,0.5);"> The smell of old paper and incense fills the air. Violet light emanates from mysterious crystals placed throughout the shop. Ancient tomes line the walls. Behind the counter stands Revna McKraken, her pale skin almost luminous in the ethereal glow, watching you with eyes that seem to pierce through your very soul. Her smile reveals just a hint of unusually sharp canines. </p> </div> <!-- Money Display --> <div style="background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); padding: 15px; border-radius: 8px; border: 2px solid #8b00ff; margin-bottom: 20px; box-shadow: 0 0 20px rgba(139,0,255,0.4);"> <p style="color: #d4b3ff; margin: 0; text-align: center; font-size: 18px; text-shadow: 0 0 10px rgba(212,179,255,0.6);"> <strong>Your Money:</strong> <<print setup.formatMoney($money)>> </p> </div> <!-- Relationship Discount Display --> <<set _revnaRelationship = $relationships["Revna McKraken"] || {level: 1, points: 0}>> <<set _discount = setup.getLampreyDiscount()>> <<if _discount > 0>> <div style="background: linear-gradient(135deg, #3a1a4a 0%, #2a0a3e 100%); padding: 10px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 20px; box-shadow: 0 0 15px rgba(81,207,102,0.4);"> <p style="color: #a3ff8f; margin: 0; text-align: center; font-size: 14px; font-weight: bold; text-shadow: 0 0 8px rgba(163,255,143,0.5);"> Relationship Discount: <<print Math.round(_discount * 100)>>% off all tomes </p> </div> <</if>> <!-- NPC Interaction --> <<set _revna = setup.findNPCByName("Revna McKraken")>> <<if _revna>> <h2 style="color: #d4b3ff; text-shadow: 0 0 15px rgba(212,179,255,0.7);">Shopkeeper</h2> <div style="border: 3px solid #8b00ff; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); box-shadow: 0 0 25px rgba(139,0,255,0.5); margin-bottom: 25px;"> <!-- NPC Image --> <<set _npcImage = setup.getNPCImage("Revna McKraken")>> <<if _npcImage>> <div style="text-align: center; margin-bottom: 20px;"> <img @src="_npcImage" style="max-width: 300px; max-height: 400px; border-radius: 10px; border: 3px solid #8b00ff; box-shadow: 0 0 20px rgba(139,0,255,0.6);" onerror="this.style.display='none';"> </div> <</if>> <h3 style="color: #d4b3ff; margin: 0 0 10px 0; text-shadow: 0 0 12px rgba(212,179,255,0.7);">Revna McKraken</h3> <p style="font-size: 14px; color: #e5d5ff; margin: 0 0 15px 0; line-height: 1.4;"> A hypnotic and cunning woman who pulls you in so naturally you don't even notice her pointy teeth. Her words and methods are strange, and she seems quite cagey about her past and personal life. You get the feeling she won't trade you anything of hers, but she might appreciate a donation. </p> <<link "<div style='background: linear-gradient(135deg, #8b00ff 0%, #6b1e6b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(139,0,255,0.6); text-shadow: 0 0 5px rgba(255,255,255,0.5);'>Talk to Revna</div>">> <<set $tradingWithNPC = _revna>> <<goto "NPCInteraction">> <</link>> </div> <</if>> <h2 style="color: #d4b3ff; text-shadow: 0 0 15px rgba(212,179,255,0.7);">Tomes for Sale</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-bottom: 25px;"> <<for _i = 0; _i < $lampreyInventory.length; _i++>> <<set _item = $lampreyInventory[_i]>> <<set _rarityColor = setup.getRarityColor(_item.rarity)>> <<set _tomeName = setup.getTraitTomeName(_item.trait)>> <<set _discountedPrice = setup.calculateLampreyPrice(_item.price)>> <div style="border: 2px solid <<print _rarityColor>>; border-radius: 8px; padding: 12px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); box-shadow: 0 0 20px <<print _rarityColor>>66, 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px;"> <h3 style="color: <<print _rarityColor>>; margin: 0 0 10px 0; font-size: 16px; text-shadow: 0 0 15px <<print _rarityColor>>, 0 0 25px <<print _rarityColor>>88;"><<print _tomeName>></h3> <div style="flex-grow: 1;"></div> <<if _discount > 0 && _discountedPrice < _item.price>> <p style="font-size: 14px; color: #888; margin: 0; text-align: center; text-decoration: line-through;"> <<print setup.formatMoney(_item.price)>> </p> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center; text-shadow: 0 0 10px rgba(81,207,102,0.6);"> <<print setup.formatMoney(_discountedPrice)>> </p> <<else>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center; text-shadow: 0 0 10px rgba(81,207,102,0.6);"> <<print setup.formatMoney(_item.price)>> </p> <</if>> <<if setup.hasLampreyTrait(_item.trait)>> <div style='background: linear-gradient(135deg, #4a2a5a 0%, #3a1a4a 100%); color: #c9a8ff; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a7b;'>Already Owned</div> <<elseif $money >= _discountedPrice>> <<capture _item, _rarityColor, _discountedPrice>> <<link "Purchase Tome">> <<set $money -= _discountedPrice>> <<run setup.addLampreyTrait(_item.trait, _item.type)>> <!-- Random Revna dialogue --> <<set _revnaDialogue = [ "An excellent selection. The pages of this tome have been waiting for a reader such as yourself.", "How marvelous. I can see the words already weaving themselves into your essence.", "Yes... I suspected you would be drawn to this particular volume.", "A most discerning choice, dear patron. The knowledge within shall serve you exquisitely well.", "Ah, the wisdom contained in these pages is truly transformative. You shall find it most... enlightening.", "This manuscript has lingered on my shelves for some time, yearning for the right reader. How fortuitous.", "The binding itself seems to resonate with your presence. A perfect pairing, wouldn't you say?", "The ancient scribes would be pleased to know their words have found such a worthy inheritor.", "How delightful. Another soul enriched by the forbidden libraries of old.", "The illuminated script within holds secrets most profound. Use them as you see fit.", "A tome of considerable potency, that one. Its passages do not take kindly to careless readers.", "The vellum practically sings in your hands, does it not? A testament to its compatibility.", "Such refined taste. I do so appreciate a patron who recognizes quality literature.", "The ink upon those pages carries power most intoxicating. Savor each word carefully.", "These words have traveled through centuries to find you. Destiny, perhaps?" ].random()>> <<set $lampreyLastPurchaseDialogue = _revnaDialogue>> <<set $lampreyLastPurchasedTrait = _item.trait>> <<goto "LampreyTomesPurchase">> <</link>> <</capture>> <<else>> <div style='background: linear-gradient(135deg, #4a2a5a 0%, #3a1a4a 100%); color: #c9a8ff; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a7b;'>Not Enough Money</div> <</if>> </div> <</for>> </div> <!-- Leave --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <div style="border: 3px solid #8b00ff; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); box-shadow: 0 0 25px rgba(139,0,255,0.5); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d4b3ff; margin: 0 0 10px 0; text-shadow: 0 0 12px rgba(212,179,255,0.7);">🚪 Exit</h3> <p style="font-size: 14px; color: #e5d5ff; margin: 0 0 auto 0; line-height: 1.4;">Leave the mystical bookstore and return to the outskirts.</p> <<link "<div style='background: linear-gradient(135deg, #8b00ff 0%, #6b1e6b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 15px rgba(139,0,255,0.6); text-shadow: 0 0 5px rgba(255,255,255,0.5);'>Leave Bookstore</div>">> <<goto "Outskirts">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Outskirts">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #888; text-align: center;">🌾 Outskirts</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a4a4a 0%, #5a5a5a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #888;"> <p style="color: white; font-size: 18px; margin: 0;"> The city fades into rural landscape here. Scattered buildings line quieter roads, and open fields stretch beyond. The air feels fresher, the pace slower. This is where the urban sprawl meets the countryside. </p> </div> <h2 style="color: #888;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Seabass Park --> <div style="border: 3px solid #2d5016; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #4a7c2c; margin: 0 0 10px 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public park with green spaces.</p> <<link "<div style='background: #2d5016; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Park</div>">> <<goto "SeabassPark">> <</link>> </div> <!-- Lamprey Tomes (Evening/Night Only) --> <<if getTimeOfDay() === "evening" || getTimeOfDay() === "night">> <style> @keyframes violetPulse { 0% { box-shadow: 0 0 10px rgba(139,0,255,0.3), 0 0 20px rgba(139,0,255,0.2); } 50% { box-shadow: 0 0 20px rgba(139,0,255,0.8), 0 0 30px rgba(139,0,255,0.5); } 100% { box-shadow: 0 0 10px rgba(139,0,255,0.3), 0 0 20px rgba(139,0,255,0.2); } } .lamprey-glow { animation: violetPulse 3s ease-in-out infinite; } </style> <div class="lamprey-glow" style="border: 3px solid #8b00ff; border-radius: 10px; padding: 15px; background: #2a2a2a; display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #b19cd9; margin: 0 0 10px 0;">📚 Lamprey Tomes</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">A mysterious bookstore glowing with violet light.</p> <<link "<div style='background: #8b00ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bookstore</div>">> <<goto "LampreyTomes">> <</link>> </div> <</if>> </div> </div> <</nobr>>
<<silently>> <<set setup.lampreyTraits to { common: { price: 500, chance: 0.90, traits: [ {trait: "Broad-shouldered", type: "physical"}, {trait: "Freckled", type: "physical"}, {trait: "Tattooed", type: "physical"}, {trait: "Deep Voice", type: "voice"}, {trait: "Emotionless Tone", type: "voice"}, {trait: "Grim Tone", type: "voice"}, {trait: "Risk Taker", type: "mental"}, {trait: "Overthinker", type: "mental"}, {trait: "Quiet", type: "mental"}, {trait: "Clingy", type: "mental"}, {trait: "Impulsive", type: "mental"}, {trait: "Disorganized", type: "mental"}, {trait: "Forgetful", type: "mental"}, {trait: "Cowardly", type: "mental"}, {trait: "Insecure", type: "mental"}, {trait: "Brave", type: "mental"}, {trait: "Witty", type: "mental"}, {trait: "Passive", type: "mental"}, {trait: "Stubborn", type: "mental"}, {trait: "Paranoid", type: "mental"}, {trait: "Bitchy", type: "mental"}, {trait: "Foolish", type: "mental"}, {trait: "Flat Chest", type: "physical"}, {trait: "Flat Butt", type: "physical"}, {trait: "Flat Masculine Chest", type: "physical"}, {trait: "Flat Masculine Butt", type: "physical"} ] }, uncommon: { price: 2000, chance: 0.20, traits: [ {trait: "Articulate Speech", type: "voice"}, {trait: "Submissive", type: "mental"}, {trait: "Sturdy", type: "physical"}, {trait: "Artistic", type: "mental"}, {trait: "Small Chest", type: "physical"}, {trait: "Small Butt", type: "physical"} ] }, rare: { price: 5000, chance: 0.05, traits: [ {trait: "Youthful", type: "physical"}, {trait: "Attractive", type: "physical"}, {trait: "Sly", type: "mental"}, {trait: "Curvy", type: "physical"}, {trait: "Voluptuous", type: "physical"}, {trait: "Perceptive", type: "mental"}, {trait: "Large Chest", type: "physical"}, {trait: "Large Butt", type: "physical"}, {trait: "Medium Chest", type: "physical"}, {trait: "Medium Butt", type: "physical"} ] }, aethereal: { price: 10000, chance: 0.01, traits: [ {trait: "Giant Chest", type: "physical"}, {trait: "Giant Butt", type: "physical"}, {trait: "Huge Chest", type: "physical"}, {trait: "Huge Butt", type: "physical"}, {trait: "Goth", type: "mental"}, {trait: "Nerd", type: "mental"}, {trait: "Jock", type: "mental"}, {trait: "Prep", type: "mental"}, {trait: "Dominant", type: "mental"} ] }, legendary: { price: 50000, chance: 0.001, traits: [ {trait: "Were-Creature", type: "physical"}, {trait: "Lucky", type: "mental"}, {trait: "Occult Expert", type: "skill"}, {trait: "Gigantic Chest", type: "physical"}, {trait: "Gigantic Butt", type: "physical"} ] } }>> <<set setup.getLampreyDiscount = function() { var relationship = State.variables.relationships["Revna McKraken"] || {level: 1, points: 0}; var discounts = { 1: 0, // Stranger - no discount 2: 0.03, // Acquaintance - 3% discount 3: 0.07, // Friend - 7% discount 4: 0.12, // Close Friend - 12% discount 5: 0.20 // Best Friend - 20% discount }; return discounts[relationship.level] || 0; }>> <<set setup.calculateLampreyPrice = function(basePrice) { var discount = setup.getLampreyDiscount(); return Math.floor(basePrice * (1 - discount)); }>> <<set setup.generateLampreyInventory = function() { var inventory = []; var guaranteedCommon = setup.lampreyTraits.common.traits.random(); inventory.push({ trait: guaranteedCommon.trait, type: guaranteedCommon.type, rarity: 'common', price: setup.lampreyTraits.common.price }); for (var i = 0; i < 3; i++) { var selectedRarity = null; var roll = Math.random(); if (roll < setup.lampreyTraits.legendary.chance) { selectedRarity = 'legendary'; } else if (roll < setup.lampreyTraits.aethereal.chance) { selectedRarity = 'aethereal'; } else if (roll < setup.lampreyTraits.rare.chance) { selectedRarity = 'rare'; } else if (roll < setup.lampreyTraits.uncommon.chance) { selectedRarity = 'uncommon'; } else { selectedRarity = 'common'; } var rarityData = setup.lampreyTraits[selectedRarity]; var traitData = rarityData.traits.random(); if (!inventory.some(function(item) { return item.trait === traitData.trait; })) { inventory.push({ trait: traitData.trait, type: traitData.type, rarity: selectedRarity, price: rarityData.price }); } else { i--; } } return inventory; }>> <<set setup.shouldRefreshLampreyInventory = function() { var currentDay = State.variables.dayNumber; var lastRefreshDay = State.variables.lampreyLastRefreshDay || -1; var currentHour = Math.floor(State.variables.timeInMinutes / 60) % 24; if (currentDay > lastRefreshDay && currentHour >= 12) { return true; } return false; }>> <<set setup.getRarityColor = function(rarity) { var colors = { common: '#aaa', uncommon: '#51cf66', rare: '#339af0', aethereal: '#b19cd9', legendary: '#ffd700' }; return colors[rarity] || '#aaa'; }>> <<set setup.getRarityName = function(rarity) { var names = { common: 'Common', uncommon: 'Uncommon', rare: 'Rare', aethereal: 'Aethereal', legendary: 'Legendary' }; return names[rarity] || 'Unknown'; }>> <</silently>>
<<nobr>> <div style="background: linear-gradient(135deg, #0a0015 0%, #1a0a2e 50%, #16001e 100%); min-height: 100vh; padding: 20px; box-shadow: inset 0 0 100px rgba(139,0,255,0.3);"> <h1 style="color: #d4b3ff; text-align: center; text-shadow: 0 0 20px rgba(212,179,255,0.8), 0 0 40px rgba(139,0,255,0.5);">📚 Lamprey Tomes</h1> <!-- Trait Acquired Display --> <div style="padding: 20px; background: linear-gradient(135deg, #1a4a1a 0%, #2d6b2d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66; box-shadow: 0 0 30px rgba(81,207,102,0.5), inset 0 0 20px rgba(81,207,102,0.2);"> <p style="color: #a3ff8f; font-size: 22px; margin: 0 0 15px 0; text-align: center; font-weight: bold; text-shadow: 0 0 15px rgba(163,255,143,0.8);"> ✨ Trait Acquired: <<print $lampreyLastPurchasedTrait>> ✨ </p> <p style="color: #e0ffe0; font-size: 16px; margin: 0; text-align: center;"> The ancient knowledge flows into your being, transforming you from within. </p> </div> <!-- Revna's Dialogue --> <div style="padding: 30px; background: linear-gradient(135deg, #4a0e4e 0%, #6b1e6b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b00ff; box-shadow: 0 0 30px rgba(139,0,255,0.5), inset 0 0 20px rgba(177,156,217,0.2);"> <p style="color: #f0e5ff; font-size: 20px; margin: 0 0 20px 0; text-align: center; font-style: italic; text-shadow: 0 0 10px rgba(240,229,255,0.5);"> "<<print $lampreyLastPurchaseDialogue>>" </p> <p style="color: #d4b3ff; font-size: 16px; margin: 0; text-align: center;"> The power flows through you as Revna's eyes gleam with mysterious satisfaction. </p> </div> <div style="text-align: center;"> <<link "<div style='background: linear-gradient(135deg, #8b00ff 0%, #6b1e6b 100%); color: white; padding: 15px 30px; border-radius: 8px; display: inline-block; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 0 15px rgba(139,0,255,0.6); text-shadow: 0 0 5px rgba(255,255,255,0.5);'>Continue Shopping</div>">> <<goto "LampreyTomes">> <</link>> </div> </div> <</nobr>>
A thank you to my patrons for your custom NPCs! Cerberus: Fen Ris, The Flying Duckman: Revna McKraken,
<<nobr>> <<set $lastLocation = "UseLaptop">> <!-- Initialize WiFi variables if not set --> <<if $wifiDaysRemaining === undefined>> <<set $wifiDaysRemaining = 0>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💻 Your Laptop</h1> <div style="padding: 20px; background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> You sit at your desk and open your laptop. The screen glows softly as various applications and options become available. </p> </div> <!-- WiFi Status Display --> <<if $hasRouter>> <<if $wifiDaysRemaining > 0>> <div style="border: 2px solid #51cf66; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; font-size: 16px;">✅ WiFi Connected</h3> <p style="font-size: 14px; color: #aaa; margin: 0; text-align: center;">Internet service active. Days remaining: <<print $wifiDaysRemaining>></p> </div> <<else>> <div style="border: 2px solid #dc3545; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #dc3545; margin: 0 0 10px 0; font-size: 16px;">❌ No Internet Connection</h3> <p style="font-size: 14px; color: #aaa; margin: 0; text-align: center;">Your internet service has expired. Pay for service at Hammerhead Tech.</p> </div> <</if>> <!-- Pay for WiFi from Home --> <<if $wifiDaysRemaining > 0>> <div style="border: 2px solid #28a745; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #28a745; margin: 0 0 10px 0; font-size: 16px;">💳 Pay for Internet Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Add 30 days of internet service for $40. You can pay in advance for multiple months.</p> <<if $money >= 40>> <<link "<div style='background: #28a745; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Pay $40 for 30 Days</div>">> <<set $money -= 40>> <<set $wifiDaysRemaining += 30>> <<goto "UseLaptop">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> </div> <</if>> <<else>> <div style="border: 2px solid #dc3545; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #dc3545; margin: 0 0 10px 0; font-size: 16px;">❌ No Router</h3> <p style="font-size: 14px; color: #aaa; margin: 0; text-align: center;">You need to buy a router and set up internet service at Hammerhead Tech.</p> </div> <</if>> <h2 style="color: #17a2b8;">What would you like to do?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Browse Internet --> <<set _internetColor = ($wifiDaysRemaining > 0) ? "#667eea" : "#666">> <<set _internetTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _internetColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _internetColor>>; margin: 0 0 10px 0;">🌐 Browse Internet</h3> <p style="font-size: 14px; color: <<print _internetTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Surf the web, check social media, and waste time online.</p> <<if $wifiDaysRemaining > 0>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse Internet</div>">> <<goto "BrowseInternet">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div> <!-- Check Email --> <<set _emailColor = ($wifiDaysRemaining > 0) ? "#ffc107" : "#666">> <<set _emailTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _emailColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _emailColor>>; margin: 0 0 10px 0;">📧 Check Email</h3> <p style="font-size: 14px; color: <<print _emailTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Read your emails and respond to messages.</p> <<if $wifiDaysRemaining > 0>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div> <!-- Play Games --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🎮 Play Games</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Play some video games to relax and pass time.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Work from Home --> <<set _workColor = ($wifiDaysRemaining > 0) ? "#28a745" : "#666">> <<set _workTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _workColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _workColor>>; margin: 0 0 10px 0;">💼 Work from Home</h3> <p style="font-size: 14px; color: <<print _workTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Do some freelance work or remote tasks to earn money.</p> <<if $wifiDaysRemaining > 0>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Close Laptop</div>">> <<goto "StudioApartment">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "WatchTV">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">📺 Watching TV</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> You settle onto the couch and turn on the TV. The screen flickers to life, offering various channels and streaming options. </p> </div> <h2 style="color: #667eea;">What would you like to watch?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Watch News --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">📰 Watch News</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Catch up on current events and local news.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Watch Movies --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🎬 Watch Movies</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Browse streaming services for movies to watch.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Watch Sports --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">⚽ Watch Sports</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Check out live games and sports highlights.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Watch Shows --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📺 Watch Shows</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Binge some TV series and episodes.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Turn Off TV</div>">> <<goto "StudioApartment">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">📡 WiFi Setup Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Tech Store Clerk">> You successfully set up your WiFi router at home. Your internet connection is now ready to use! <<else>> The store clerk helped you set up your WiFi router at home. Your internet connection is now ready to use! <</if>> </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">✅ Setup Successful</h2> <p style="color: #aaa; margin: 0 0 10px 0; text-align: center;">Your router has been configured and is broadcasting WiFi.</p> <p style="color: #ccc; margin: 0; text-align: center; font-size: 14px;">Remember: You need to pay $40/month for internet service to keep it active.</p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #17a2b8; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Store</div>">> <<goto "TechStore">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BrowseInternet">> <!-- Auto-register if not already registered --> <<if $streamingRegistered === undefined>> <<set $streamingRegistered = true>> <</if>> <<if $contentCreatorRegistered === undefined>> <<set $contentCreatorRegistered = true>> <</if>> <<if $prawnhubRegistered === undefined>> <<set $prawnhubRegistered = true>> <</if>> <style> .internet-grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2, auto); gap: 15px; margin-bottom: 25px; } .internet-card { border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; } /* Explicit grid positions */ .grid-pos-1 { grid-column: 1; grid-row: 1; } .grid-pos-2 { grid-column: 2; grid-row: 1; } .grid-pos-3 { grid-column: 3; grid-row: 1; } .grid-pos-4 { grid-column: 1; grid-row: 2; } .grid-pos-5 { grid-column: 2; grid-row: 2; } .grid-pos-6 { grid-column: 3; grid-row: 2; } .card-title { margin: 0 0 10px 0; } .card-description { font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1; } .card-button { padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; color: white; } .card-button-disabled { background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px; } .card-button-coming-soon { background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; } </style> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🌐 Browsing the Internet</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> You're connected to the internet. Various websites and platforms are available for you to explore. </p> </div> <h2 style="color: #667eea;">What would you like to do?</h2> <div class="internet-grid"> <!-- Position 1: Social Media --> <div class="internet-card grid-pos-1" style="border: 3px solid #3498db;"> <h3 class="card-title" style="color: #3498db;">📱 Social Media</h3> <p class="card-description">Browse social media feeds and interact with posts.</p> <div class="card-button-coming-soon">Coming Soon</div> </div> <!-- Position 2: News & Articles --> <div class="internet-card grid-pos-2" style="border: 3px solid #f39c12;"> <h3 class="card-title" style="color: #f39c12;">📰 News & Articles</h3> <p class="card-description">Read the latest news and trending articles.</p> <div class="card-button-coming-soon">Coming Soon</div> </div> <!-- Position 3: Content Creation Platform --> <div class="internet-card grid-pos-3" style="border: 3px solid #e74c3c;"> <h3 class="card-title" style="color: #e74c3c;">🎬 Post Content</h3> <p class="card-description">Create and post videos or photos to earn money.</p> <<if $hasWebcam>> <<link "<div class='card-button' style='background: #e74c3c;'>Create Content</div>">> <<goto "PostContent">> <</link>> <<else>> <div class="card-button-disabled">Requires Webcam</div> <</if>> </div> <!-- Position 4: Streaming Platform --> <div class="internet-card grid-pos-4" style="border: 3px solid #9b59b6;"> <h3 class="card-title" style="color: #9b59b6;">📹 Streaming Platform</h3> <p class="card-description"> Followers: <strong style="color: #e74c3c;"><<= $streamingData ? $streamingData.followers : 0>></strong><br> Total Streams: <<= $streamingData ? $streamingData.totalStreams : 0>> </p> <<if $hasWebcam>> <<link "<div class='card-button' style='background: #9b59b6;'>Go Live</div>">> <<goto "SelectStreamCategory">> <</link>> <<else>> <div class="card-button-disabled">Requires Webcam</div> <</if>> </div> <!-- Position 5: Stream Analytics --> <div class="internet-card grid-pos-5" style="border: 3px solid #27ae60;"> <h3 class="card-title" style="color: #27ae60;">📊 Stream Analytics</h3> <p class="card-description">View your streaming statistics, growth trends, and performance metrics.</p> <<link "<div class='card-button' style='background: #27ae60;'>View Analytics</div>">> <<goto "StreamAnalytics">> <</link>> </div> <!-- Position 6: PrawnHub --> <div class="internet-card grid-pos-6" style="border: 3px solid #ff1493;"> <h3 class="card-title" style="color: #ff1493;">🔞 PrawnHub</h3> <p class="card-description">Adult entertainment platform for browsing and streaming adult content.</p> <<link "<div class='card-button' style='background: #ff1493;'>Enter Site</div>">> <<goto "PrawnHub">> <</link>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Laptop</div>">> <<goto "UseLaptop">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StreamingRegistration">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">📹 Streaming Registration Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> You've successfully registered for a streaming platform! You can now go live and broadcast content to viewers who can tip you or subscribe to your channel. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">✅ Account Created</h2> <p style="color: #aaa; margin: 0 0 10px 0; text-align: center;">Your streaming profile has been set up and verified.</p> <p style="color: #ccc; margin: 0; text-align: center; font-size: 14px;">You can now start streaming from the Browse Internet menu.</p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<!-- Browse Internet --> <<set _internetColor = ($wifiDaysRemaining > 0) ? "#667eea" : "#666">> <<set _internetTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _internetColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _internetColor>>; margin: 0 0 10px 0;">🌐 Browse Internet</h3> <p style="font-size: 14px; color: <<print _internetTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Surf the web, check social media, and waste time online.</p> <<if $wifiDaysRemaining > 0>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse Internet</div>">> <<goto "BrowseInternet">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e74c3c; text-align: center;">🎬 Content Creation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: white; font-size: 18px; margin: 0;"> Create and upload photos or videos to your content platform. Your earnings depend on views, likes, and subscriber count. </p> </div> <h2 style="color: #e74c3c;">What type of content would you like to create?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">📸 Photo Content</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Take and upload photos for your followers.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🎥 Video Content</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Record and upload videos for your audience.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">📹 Live Streaming</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> Go live and interact with your audience in real-time. Earn money through tips, subscriptions, and donations from viewers. </p> </div> <h2 style="color: #9b59b6;">What would you like to stream?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">💬 Just Chatting</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Chat with your viewers and hang out.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🎮 Gaming Stream</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Stream yourself playing games.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🎨 Creative Stream</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Stream art, music, or other creative work.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$streamingData.currentStream>> <<run setup.startStream("asmr")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div class="stream-header"> <h1> <span class="live-indicator"></span> ASMR Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Relaxing ASMR content for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Random special request (20% chance if 2+ hours streamed) --> <<if _stream.hoursStreamed >= 2 && Math.random() < 0.20 && !_stream.pendingRequest>> <<set _stream.pendingRequest = setup.streamSpecialRequests("asmr")>> <</if>> <<if _stream.pendingRequest>> <div class="special-request"> <h3>💵 Special Request!</h3> <p><<= _stream.pendingRequest.description>></p> <p style="color: white; font-weight: bold; margin-top: 10px;"> Payment: $<<= _stream.pendingRequest.payment>> </p> <div class="request-buttons"> <<link "<div class='request-button accept'>✓ Accept Request</div>">> <<set $money += _stream.pendingRequest.payment>> <<set _stream.incomeData.total += _stream.pendingRequest.payment>> <<set _stream.viewerData.current += _stream.pendingRequest.viewers>> <<run _stream.events.push({ event: "Special Request Completed", hour: _stream.hoursStreamed + 1, description: "You fulfilled a special viewer request for $" + _stream.pendingRequest.payment + "!" })>> <<set _stream.pendingRequest = null>> <<goto "StartASMRStream">> <</link>> <<link "<div class='request-button decline'>✗ Decline</div>">> <<set _stream.pendingRequest = null>> <<goto "StartASMRStream">> <</link>> </div> </div> <</if>> <!-- Action Selection --> <div class="action-selection"> <h2>🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <div class="action-grid"> <<set _actions = setup.streamActions.asmr>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <div class="action-card" style="border: 3px solid #9b59b6; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease;"> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<= _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span>+<<= _actionData.baseViewerGain>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span>~$<<= _actionData.baseMoney>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span><<= _actionData.baseEngagement>>%</span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</nobr>> <style> /* Include streaming styles inline */ <<include "StreamingStyles">> </style>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <h1 style="color: white; text-align: center; margin: 0;">🔹 Choose Stream Category</h1> <p style="color: #ffd; text-align: center; margin: 10px 0 0 0;"> Select what type of content you want to stream </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- ASMR --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🎧 ASMR</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Relaxing content with whispers, tapping, and soothing sounds. Perfect for viewers seeking calm. </p> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start ASMR Stream</div>">> <<goto "StartASMRStream">> <</link>> </div> <!-- Styling & Makeup --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💄 Styling & Makeup</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Beauty tutorials and styling tips. Perfect for makeup artists and beauty enthusiasts. </p> <<link "<div style='background: #e91e63; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Beauty Stream</div>">> <<goto "StartStylingStream">> <</link>> </div> <!-- Gaming --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🎮 Gaming</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Video game streams and playthroughs. Perfect for gamers and entertaining personalities. </p> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Gaming Stream</div>">> <<goto "StartGamingStream">> <</link>> </div> <!-- Music --> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎵 Music</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Live musical performances. Perfect for musicians and singers. </p> <<link "<div style='background: #ff6347; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Music Stream</div>">> <<goto "StartMusicStream">> <</link>> </div> <!-- Cooking --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🍳 Cooking</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Culinary streams and recipe sharing. Perfect for chefs and food enthusiasts. </p> <<link "<div style='background: #f39c12; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Cooking Stream</div>">> <<goto "StartCookingStream">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _stream = $streamingData.currentStream>> <<set _result = $streamActionResult>> <div class="streaming-container"> <!-- Header --> <div class="stream-header"> <h1> <span class="live-indicator"></span> Hour <<= _stream.hoursStreamed>> Complete! </h1> </div> <!-- Result Summary --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(81, 207, 102, 0.3); margin-bottom: 25px;"> <h2 style="color: #51cf66; margin: 0 0 20px 0; text-align: center;"> 📊 Performance This Hour </h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">VIEWERS</div> <div style="font-size: 28px; font-weight: bold; color: #3498db;"><<= _result.viewers>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">ENGAGEMENT</div> <div style="font-size: 28px; font-weight: bold; color: #9b59b6;"><<= _result.engagement>>%</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">EARNED</div> <div style="font-size: 28px; font-weight: bold; color: #f39c12;">$<<= _result.money>></div> <<if _result.donations && _result.donations.count > 0>> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> <<= _result.donations.count>> donation<<if _result.donations.count !== 1>>s<</if>> (avg $<<= _result.donations.avgDonation>>) </div> <<else>> <div style="font-size: 12px; color: #888; margin-top: 5px; font-style: italic;"> No donations this hour </div> <</if>> </div> </div> <<if _result.randomEvent>> <div style="margin-top: 20px; padding: 15px; background: #ffd43b; border-radius: 8px; border: 2px solid #f39c12;"> <div style="color: #1a1a1a; font-weight: bold; font-size: 16px; margin-bottom: 5px;"> 🎉 <<= _result.randomEvent.name>> </div> <div style="color: #2d2d2d; font-size: 14px;"> <<= _result.randomEvent.description>> </div> </div> <</if>> </div> <!-- Continue/End Options --> <div style="text-align: center;"> <<if _stream.hoursStreamed < _stream.maxHours>> <<if _stream.category === "asmr">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartASMRStream">> <</link>> <<elseif _stream.category === "styling">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartStylingStream">> <</link>> <<elseif _stream.category === "gaming">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartGamingStream">> <</link>> <<elseif _stream.category === "music">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartMusicStream">> <</link>> <<elseif _stream.category === "cooking">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartCookingStream">> <</link>> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button end'>📴 End Stream Now</div>">> <<goto "StreamResults">> <</link>> </div> <<else>> <p style="color: #e74c3c; font-size: 18px; margin-bottom: 20px;"> ⏰ Maximum stream time reached! </p> <<link "<div class='stream-button'>📊 View Final Results</div>">> <<goto "StreamResults">> <</link>> <</if>> </div> </div> <</nobr>> <style> /* Streaming styles would go here or be included */ .streaming-container { background: #1a1a1a; min-height: 100vh; padding: 20px; color: #e0e0e0; } .stream-header { padding: 25px; background: linear-gradient(135deg, #9b59b6 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 0 30px rgba(155, 89, 182, 0.4); text-align: center; } .stream-header h1 { color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px; } .stream-button { display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); cursor: pointer; transition: all 0.3s ease; } .stream-button:hover { transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0,0,0,0.4); } .stream-button.end { background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); } .live-indicator { display: inline-block; width: 12px; height: 12px; background: #e74c3c; border-radius: 50%; margin-right: 8px; animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.5; transform: scale(1.2); } } </style>
<<if !$streamingData>> <<set $streamingData = { followers: 0, totalStreams: 0, categoryUnlocked: { asmr: true, stylingMakeup: false, music: false, cooking: false, gaming: false }, streamHistory: [], currentStream: null }>> <</if>> <<if !$adultStreamingData>> <<set $adultStreamingData = { followers: 0, totalStreams: 0, streamHistory: [], currentStream: null }>> <</if>> <<if !$adultStreamingRegistered>> <<set $adultStreamingRegistered = false>> <</if>>
<<nobr>> <<set _stream = $streamingData.currentStream>> <<set _endResults = setup.endStream()>> <div class="streaming-container"> <!-- Header --> <div class="stream-header"> <h1>📊 Stream Complete!</h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Great work! Here are your results. </p> </div> <!-- Overall Summary --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(243, 156, 18, 0.3); margin-bottom: 25px;"> <h2 style="color: #f39c12; margin: 0 0 20px 0;">📈 Stream Summary</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Hours Streamed</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<= _stream.hoursStreamed>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #e74c3c;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">New Followers</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">+<<= _stream.newFollowers>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #f39c12;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Total Earnings</div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;">$<<= _stream.incomeData.total>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #9b59b6;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Avg Engagement</div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<= _stream.engagementData.average>>%</div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Peak Viewers</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<= _stream.viewerData.peak>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #e74c3c;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Total Followers</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;"><<= $streamingData.followers>></div> </div> </div> </div> <!-- Job Update Messages --> <<if _endResults.becameStreamer>> <div style="background: linear-gradient(135deg, #27ae60 0%, #229954 100%); padding: 25px; border-radius: 12px; border: 3px solid #27ae60; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(39, 174, 96, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">🎉 Congratulations!</h2> <p style="color: #ffd; font-size: 18px; margin: 0;"> You've reached 500 followers! Your job is now <strong>Streamer</strong>!<br> You can now stream for up to 8 hours per day. </p> </div> <<elseif _endResults.hasOtherJob && $streamingData.followers >= 500>> <div style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: white; margin: 0 0 15px 0;">💼 Job Opportunity</h2> <p style="color: #ffd; font-size: 16px; margin: 0 0 15px 0;"> You've reached 500 followers! Would you like to quit your current job and become a full-time Streamer? </p> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='display: inline-block; background: #27ae60; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✓ Become Streamer (8 hrs/day)</div>">> <<set $jobs = ["Streamer"]>> <<goto "UseLaptop">> <</link>> <<link "<div style='display: inline-block; background: #7f8c8d; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✗ Keep Current Job (4 hrs/day)</div>">> <<goto "UseLaptop">> <</link>> </div> </div> <</if>> <!-- Hourly Breakdown --> <<if _stream.actions && _stream.actions.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">⏱️ Hourly Breakdown</h2> <<for _i = 0; _i < _stream.actions.length; _i++>> <<set _action = _stream.actions[_i]>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 10px; border: 2px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;"> <div> <strong style="color: #4dabf7;">Hour <<= _action.hour>>:</strong> <span style="color: #aaa; margin-left: 10px;"><<= _action.action>></span> </div> <div style="display: flex; gap: 15px; font-size: 14px;"> <span style="color: #3498db;">👁️ <<= _action.viewers>></span> <span style="color: #9b59b6;">📊 <<= _action.engagement>>%</span> <span style="color: #f39c12;">💰 $<<= _action.money>></span> <<if _action.donations && _action.donations.count > 0>> <span style="color: #aaa;">(<<= _action.donations.count>> tips)</span> <<else>> <span style="color: #666; font-style: italic;">(no tips)</span> <</if>> </div> </div> </div> <</for>> </div> <</if>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #f39c12;"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">💰 Earnings Breakdown</h3> <div style="color: #aaa; line-height: 1.8;"> <p style="margin: 5px 0;"><strong>Gross Earnings:</strong> <span style="color: #51cf66;">$<<= $streamingData.lastStream.grossEarnings>></span></p> <<set _platformPercent = Math.round(($streamingData.lastStream.platformCut / $streamingData.lastStream.grossEarnings) * 100)>> <p style="margin: 5px 0;"><strong>Platform Cut (<<= _platformPercent>>%):</strong> <span style="color: #e74c3c;">-$<<= $streamingData.lastStream.platformCut>></span></p> <p style="margin: 5px 0; padding-top: 10px; border-top: 2px solid #444;"><strong>Net Earnings:</strong> <span style="color: #ffd43b; font-size: 18px;">$<<= $streamingData.lastStream.netEarnings>></span></p> </div> <<if !$jobs || !$jobs.includes("Streamer")>> <div style="background: #3a2020; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #e74c3c;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> ⚠️ <strong>High Platform Fee!</strong> Get the Streamer job to reduce the platform cut from 70% to 30%. </p> </div> <</if>> </div> <!-- Notable Events --> <<if _stream.events && _stream.events.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0;">🎬 Notable Events</h2> <div style="display: flex; flex-direction: column; gap: 12px;"> <<for _i = 0; _i < _stream.events.length; _i++>> <<set _event = _stream.events[_i]>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ffd43b;"> <div style="color: white; font-weight: bold; margin-bottom: 5px;"> Hour <<= _event.hour>>: <<= _event.event>> </div> <div style="color: #aaa; font-size: 14px;"> <<= _event.description>> </div> </div> <</for>> </div> </div> <</if>> <!-- Return Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div class='stream-button'>← Return to Internet</div>">> <<set $streamingData.currentStream = null>> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>> <style> .streaming-container { background: #1a1a1a; min-height: 100vh; padding: 20px; color: #e0e0e0; } .stream-header { padding: 25px; background: linear-gradient(135deg, #9b59b6 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 0 30px rgba(155, 89, 182, 0.4); text-align: center; } .stream-header h1 { color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px; } .stream-button { display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); cursor: pointer; transition: all 0.3s ease; } .stream-button:hover { transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0,0,0,0.4); } </style>
<<nobr>> <<set $lastLocation = "BrowseInternet">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #27ae60 0%, #229954 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #27ae60; box-shadow: 0 0 30px rgba(39, 174, 96, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">📊 Stream Analytics Dashboard</h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Track your streaming performance and growth </p> </div> <!-- Overall Stats --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #27ae60; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #27ae60; margin: 0 0 20px 0;">🎯 Channel Overview</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL FOLLOWERS</div> <div style="font-size: 32px; font-weight: bold; color: #e74c3c;"><<= $streamingData.followers>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL STREAMS</div> <div style="font-size: 32px; font-weight: bold; color: #3498db;"><<= $streamingData.totalStreams>></div> </div> <<if $streamingData.streamHistory && $streamingData.streamHistory.length > 0>> <<set _totalHours = 0>> <<set _totalIncome = 0>> <<for _i = 0; _i < $streamingData.streamHistory.length; _i++>> <<set _totalHours += $streamingData.streamHistory[_i].hours>> <<set _totalIncome += $streamingData.streamHistory[_i].income>> <</for>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">HOURS STREAMED</div> <div style="font-size: 32px; font-weight: bold; color: #9b59b6;"><<= _totalHours>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 32px; font-weight: bold; color: #f39c12;">$<<= _totalIncome>></div> </div> <</if>> </div> </div> <!-- Stream History --> <<if $streamingData.streamHistory && $streamingData.streamHistory.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 20px 0;">📅 Recent Stream History (Last 7)</h2> <<set _historyLength = $streamingData.streamHistory.length>> <<set _startIdx = Math.max(0, _historyLength - 7)>> <<for _i = _historyLength - 1; _i >= _startIdx; _i-->> <<set _stream = $streamingData.streamHistory[_i]>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <div> <strong style="color: #4dabf7; font-size: 18px;"><<= _stream.date>></strong> <span style="color: #aaa; margin-left: 15px;"><<= _stream.category.toUpperCase()>></span> </div> <div style="color: #aaa;"><<= _stream.hours>> hour<<if _stream.hours !== 1>>s<</if>></div> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px;"> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">NEW FOLLOWERS</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">+<<= _stream.newFollowers>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">PEAK VIEWERS</div> <div style="color: #3498db; font-size: 20px; font-weight: bold;"><<= _stream.viewers.peak>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">AVG ENGAGEMENT</div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<= _stream.engagement>>%</div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">EARNED</div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;">$<<= _stream.income>></div> </div> </div> </div> <</for>> </div> <!-- Last 7 Streams Statistics --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #e74c3c; margin: 0 0 20px 0;">📈 Last 7 Streams Statistics</h2> <<set _historyLength = $streamingData.streamHistory.length>> <<set _statsStartIdx = Math.max(0, _historyLength - 7)>> <<set _last7TotalFollowers = 0>> <<set _last7TotalIncome = 0>> <<set _last7TotalHours = 0>> <<set _last7TotalViewers = 0>> <<set _last7TotalEngagement = 0>> <<set _last7Count = 0>> <<for _j = _statsStartIdx; _j < _historyLength; _j++>> <<set _last7TotalFollowers += $streamingData.streamHistory[_j].newFollowers>> <<set _last7TotalIncome += $streamingData.streamHistory[_j].income>> <<set _last7TotalHours += $streamingData.streamHistory[_j].hours>> <<set _last7TotalViewers += $streamingData.streamHistory[_j].viewers.peak>> <<set _last7TotalEngagement += $streamingData.streamHistory[_j].engagement>> <<set _last7Count++>> <</for>> <<set _avgViewers = Math.round(_last7TotalViewers / _last7Count)>> <<set _avgEngagement = Math.round(_last7TotalEngagement / _last7Count)>> <<set _avgIncomePerStream = Math.round(_last7TotalIncome / _last7Count)>> <<set _avgFollowersPerStream = Math.round(_last7TotalFollowers / _last7Count)>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL NEW FOLLOWERS</div> <div style="font-size: 28px; font-weight: bold; color: #e74c3c;">+<<= _last7TotalFollowers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: <<= _avgFollowersPerStream>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 28px; font-weight: bold; color: #f39c12;">$<<= _last7TotalIncome>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: $<<= _avgIncomePerStream>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG PEAK VIEWERS</div> <div style="font-size: 28px; font-weight: bold; color: #3498db;"><<= _avgViewers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<= _last7Count>> streams</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG ENGAGEMENT</div> <div style="font-size: 28px; font-weight: bold; color: #9b59b6;"><<= _avgEngagement>>%</div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<= _last7Count>> streams</div> </div> </div> </div> <<else>> <!-- No Stream History --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 12px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center;"> <div style="font-size: 48px; margin-bottom: 20px;">📊</div> <h2 style="color: #aaa; margin: 0 0 15px 0;">No Stream Data Yet</h2> <p style="color: #888; font-size: 16px; margin: 0;"> Start streaming to see your analytics and performance metrics here! </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Check if player has Makeup skill --> <<if !$skills.includes("Makeup")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 25px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 0 30px rgba(231, 76, 60, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> 🚫 Skill Required </h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; border: 2px solid #e74c3c; text-align: center;"> <p style="color: #aaa; font-size: 18px; line-height: 1.6; margin: 0 0 25px 0;"> You need the <strong style="color: #e91e63;">Makeup</strong> skill to stream Styling & Makeup content. </p> <p style="color: #888; font-size: 16px; margin: 0 0 25px 0;"> Without professional makeup skills, you won't be able to create quality beauty tutorials. </p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Categories</div>">> <<goto "SelectStreamCategory">> <</link>> </div> </div> <<else>> <<if !$streamingData.currentStream>> <<run setup.startStream("styling")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 0 30px rgba(233, 30, 99, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> <span class="live-indicator"></span> Styling & Makeup Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Beauty tutorials and styling tips for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Random special request (20% chance if 2+ hours streamed) --> <<if _stream.hoursStreamed >= 2 && Math.random() < 0.20 && !_stream.pendingRequest>> <<set _stream.pendingRequest = setup.streamSpecialRequests("styling")>> <</if>> <<if _stream.pendingRequest>> <div class="special-request"> <h3>💵 Special Request!</h3> <p><<= _stream.pendingRequest.description>></p> <p style="color: white; font-weight: bold; margin-top: 10px;"> Payment: $<<= _stream.pendingRequest.payment>> </p> <div class="request-buttons"> <<link "<div class='request-button accept'>✓ Accept Request</div>">> <<set $money += _stream.pendingRequest.payment>> <<set _stream.incomeData.total += _stream.pendingRequest.payment>> <<set _stream.viewerData.current += _stream.pendingRequest.viewers>> <<run _stream.events.push({ event: "Special Request Completed", hour: _stream.hoursStreamed + 1, description: "You fulfilled a special viewer request for $" + _stream.pendingRequest.payment + "!" })>> <<set _stream.pendingRequest = null>> <<goto "StartStylingStream">> <</link>> <<link "<div class='request-button decline'>✗ Decline</div>">> <<set _stream.pendingRequest = null>> <<goto "StartStylingStream">> <</link>> </div> </div> <</if>> <!-- Action Selection --> <div class="action-selection"> <h2>🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <div class="action-grid"> <<set _actions = setup.streamActions.styling>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <div class="action-card" style="border: 3px solid #e91e63; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease;"> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<= _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span>+<<= _actionData.baseViewerGain>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span>~$<<= _actionData.baseMoney>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span><<= _actionData.baseEngagement>>%</span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>> <style> /* Include streaming styles inline */ <<include "StreamingStyles">> </style>
<<nobr>> <<if !$streamingData.currentStream>> <<run setup.startStream("gaming")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 0 30px rgba(52, 152, 219, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> <span class="live-indicator"></span> Gaming Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Epic gameplay and entertainment for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Random special request (20% chance if 2+ hours streamed) --> <<if _stream.hoursStreamed >= 2 && Math.random() < 0.20 && !_stream.pendingRequest>> <<set _stream.pendingRequest = setup.streamSpecialRequests("gaming")>> <</if>> <<if _stream.pendingRequest>> <div class="special-request"> <h3>💵 Special Request!</h3> <p><<= _stream.pendingRequest.description>></p> <p style="color: white; font-weight: bold; margin-top: 10px;"> Payment: $<<= _stream.pendingRequest.payment>> </p> <div class="request-buttons"> <<link "<div class='request-button accept'>✓ Accept Request</div>">> <<set $money += _stream.pendingRequest.payment>> <<set _stream.incomeData.total += _stream.pendingRequest.payment>> <<set _stream.viewerData.current += _stream.pendingRequest.viewers>> <<run _stream.events.push({ event: "Special Request Completed", hour: _stream.hoursStreamed + 1, description: "You fulfilled a special viewer request for $" + _stream.pendingRequest.payment + "!" })>> <<set _stream.pendingRequest = null>> <<goto "StartGamingStream">> <</link>> <<link "<div class='request-button decline'>✗ Decline</div>">> <<set _stream.pendingRequest = null>> <<goto "StartGamingStream">> <</link>> </div> </div> <</if>> <!-- Action Selection --> <div class="action-selection"> <h2>🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <div class="action-grid"> <<set _actions = setup.streamActions.gaming>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <div class="action-card" style="border: 3px solid #3498db; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease;"> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<= _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span>+<<= _actionData.baseViewerGain>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span>~$<<= _actionData.baseMoney>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span><<= _actionData.baseEngagement>>%</span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</nobr>> <style> .streaming-container { background: #1a1a1a; min-height: 100vh; padding: 20px; color: #e0e0e0; } .live-indicator { display: inline-block; width: 12px; height: 12px; background: #e74c3c; border-radius: 50%; margin-right: 8px; animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.5; transform: scale(1.2); } } .stream-stats-bar { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 25px; } .stat-card { background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 10px; border: 2px solid #333; text-align: center; } .stat-card.followers { border-color: #e74c3c; } .stat-card.viewers { border-color: #3498db; } .stat-card.money { border-color: #f39c12; } .stat-card.time { border-color: #9b59b6; } .stat-icon { font-size: 28px; margin-bottom: 8px; } .stat-label { font-size: 12px; color: #aaa; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 5px; } .stat-value { font-size: 24px; font-weight: bold; color: white; } .event-notification { background: linear-gradient(135deg, #ffd43b 0%, #f39c12 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); } .event-notification h3 { color: #1a1a1a; margin: 0 0 10px 0; font-size: 20px; } .event-notification p { color: #2d2d2d; margin: 0; font-size: 16px; } .trait-effects { background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; } .trait-effects h2 { color: #51cf66; margin: 0 0 20px 0; font-size: 22px; } .trait-list { display: grid; gap: 10px; } .trait-item { background: #0a0a0a; padding: 12px; border-radius: 8px; display: flex; align-items: center; gap: 12px; border: 2px solid #333; } .trait-item.positive { border-color: #51cf66; } .trait-item.negative { border-color: #ff6b6b; } .trait-icon { font-size: 20px; } .trait-info { flex: 1; } .trait-name { color: white; font-weight: bold; font-size: 14px; margin-bottom: 3px; } .trait-description { color: #aaa; font-size: 12px; } .special-request { background: linear-gradient(135deg, #9b59b6 0%, #764ba2 100%); padding: 25px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center; } .special-request h3 { color: white; margin: 0 0 15px 0; font-size: 24px; } .special-request p { color: #ffd; font-size: 16px; margin: 0; } .request-buttons { display: flex; gap: 15px; justify-content: center; margin-top: 20px; } .request-button { padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer; transition: all 0.3s ease; } .request-button.accept { background: #27ae60; color: white; } .request-button.accept:hover { background: #229954; transform: translateY(-2px); } .request-button.decline { background: #7f8c8d; color: white; } .request-button.decline:hover { background: #6c7a7b; transform: translateY(-2px); } .action-selection { background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; } .action-selection h2 { color: #3498db; margin: 0 0 10px 0; font-size: 24px; } .action-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; } .action-card a { color: #3498db; font-size: 18px; font-weight: bold; text-decoration: none; display: block; margin-bottom: 10px; } .action-card a:hover { color: #5dade2; } .action-card:hover { transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0,0,0,0.6); border-color: #5dade2; } .stream-button { display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); cursor: pointer; transition: all 0.3s ease; } .stream-button:hover { transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0,0,0,0.4); } .stream-button.end { background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); } </style>
<<nobr>> <!-- Check if player has required music skills --> <<set _hasSinging = $skills.includes("Singing")>> <<set _hasGuitar = $skills.includes("Guitar")>> <<set _hasPiano = $skills.includes("Piano")>> <<if !_hasSinging && !_hasGuitar && !_hasPiano>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 25px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 0 30px rgba(231, 76, 60, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> 🚫 Skill Required </h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; border: 2px solid #e74c3c; text-align: center;"> <p style="color: #aaa; font-size: 18px; line-height: 1.6; margin: 0 0 25px 0;"> You need at least one of these skills to stream music: <strong style="color: #ff6347;">Singing</strong>, <strong style="color: #ff6347;">Guitar</strong>, or <strong style="color: #ff6347;">Piano</strong>. </p> <p style="color: #888; font-size: 16px; margin: 0 0 25px 0;"> Without musical skills, you won't be able to create quality music content. </p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Categories</div>">> <<goto "SelectStreamCategory">> <</link>> </div> </div> <<else>> <<if !$streamingData.currentStream>> <<run setup.startStream("music")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div class="stream-header" style="background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%);"> <h1> <span class="live-indicator"></span> Music Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Live musical performance for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Action Selection --> <div class="action-selection"> <h2 style="color: #ff6347;">🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <div class="action-grid"> <<set _actions = setup.streamActions.music>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <div class="action-card" style="border: 3px solid #ff6347; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease;"> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<= _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span>+<<= _actionData.baseViewerGain>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span>~$<<= _actionData.baseMoney>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span><<= _actionData.baseEngagement>>%</span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>> <style> /* Include streaming styles inline */ <<include "StreamingStyles">> </style>
<<nobr>> <!-- Check if player has required cooking skills --> <<set _hasCooking = $skills.includes("Cooking")>> <<set _hasBaking = $skills.includes("Baking")>> <<if !_hasCooking && !_hasBaking>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 25px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 0 30px rgba(231, 76, 60, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> 🚫 Skill Required </h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; border: 2px solid #e74c3c; text-align: center;"> <p style="color: #aaa; font-size: 18px; line-height: 1.6; margin: 0 0 25px 0;"> You need at least one of these skills to stream cooking: <strong style="color: #f39c12;">Cooking</strong> or <strong style="color: #f39c12;">Baking</strong>. </p> <p style="color: #888; font-size: 16px; margin: 0 0 25px 0;"> Without culinary skills, you won't be able to create quality cooking content. </p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Categories</div>">> <<goto "SelectStreamCategory">> <</link>> </div> </div> <<else>> <<if !$streamingData.currentStream>> <<run setup.startStream("cooking")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div class="stream-header" style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%);"> <h1> <span class="live-indicator"></span> Cooking Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Delicious cooking content for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Action Selection --> <div class="action-selection"> <h2 style="color: #f39c12;">🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to cook for the next hour of your stream. </p> <div class="action-grid"> <<set _actions = setup.streamActions.cooking>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <div class="action-card" style="border: 3px solid #f39c12; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease;"> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<= _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span>+<<= _actionData.baseViewerGain>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span>~$<<= _actionData.baseMoney>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span><<= _actionData.baseEngagement>>%</span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>> <style> /* Include streaming styles inline */ <<include "StreamingStyles">> </style>
<<nobr>> <<if !setup.isMallOpen()>> <<goto "MallClosed">> <</if>> <<set $lastLocation = "MallFloor2">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🛍️ Sunfish City Mall - Floor 2</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> The second floor features specialty shops and music stores. The sound of distant music drifts through the corridors. </p> </div> <h2 style="color: #9b59b6;">Floor 2 Directory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Turbo Tuna Athletics --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚡ Turbo Tuna Athletics</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">High-performance sportswear and athletic gear.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Neon Tetra Temptations --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">💋 Neon Tetra Temptations</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Seductive lingerie and intimate apparel.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Puffers and Pockets --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">👕 Puffers and Pockets</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Comfortable everyday wear and casual fashion.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Koi Crown --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">👑 Koi Crown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Premium designer fashion and luxury apparel.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Chromis Tunes --> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎸 Chromis Tunes</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Musical instruments, gear, and recording equipment.</p> <<link "<div style='background: #ff6347; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "ChromisTunes">> <</link>> </div> </div> <br> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #9b59b6; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Go to Floor 1 ⬇️</div>">> <<goto "Mall">> <</link>> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Mall</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ChromisTunes">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6347; text-align: center;">🎸 Chromis Tunes</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6347;"> <p style="color: white; font-size: 18px; margin: 0;"> The walls are lined with guitars, keyboards, and audio equipment. The faint hum of amplifiers fills the air, and you can hear someone testing a drum kit in the back room. </p> </div> <h2 style="color: #ff6347;">Available Equipment</h2> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Guitar --> <div style="border: 3px solid <<if $ownsGuitar>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎸 Guitar</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A quality acoustic-electric guitar perfect for streaming.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $500</p> <<if $ownsGuitar>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif $money >= 500>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set $money -= 500>> <<set $ownsGuitar = true>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> <!-- Electric Piano --> <div style="border: 3px solid <<if $ownsElectricPiano>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎹 Electric Piano</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A professional 88-key digital piano with weighted keys.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $800</p> <<if $ownsElectricPiano>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif $money >= 800>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set $money -= 800>> <<set $ownsElectricPiano = true>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> <!-- Microphone --> <div style="border: 3px solid <<if $ownsMicrophone>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎤 Microphone</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A studio-quality condenser microphone with stand.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $300</p> <<if $ownsMicrophone>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif $money >= 300>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set $money -= 300>> <<set $ownsMicrophone = true>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> <!-- Speakers --> <div style="border: 3px solid <<if $ownsSpeakers>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🔊 Speakers</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">High-quality studio monitor speakers (pair).</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $600</p> <<if $ownsSpeakers>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif $money >= 600>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set $money -= 600>> <<set $ownsSpeakers = true>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> </div> <br> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Back to Floor 2</div>">> <<goto "MallFloor2">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("ChromisTunes")>> <h2 style="color: #ff6347;">🎸 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #ff6347; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The music store is quiet right now. Just the hum of amplifiers in the background. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$hideTraitEffects>> <div class="trait-list"> <<for _i = 0; _i < _stream.modifiers.traits.length; _i++>> <<set _trait = _stream.modifiers.traits[_i]>> <div @class="'trait-item ' + _trait.type"> <div class="trait-icon"><<if _trait.type === "positive">>✅<<else>>❌<</if>></div> <div class="trait-info"> <div class="trait-name"><<= _trait.name>></div> <div class="trait-description"><<= _trait.description>></div> </div> </div> <</for>> </div> <div style="margin-top: 15px; padding: 12px; background: #0a0a0a; border-radius: 8px; border: 1px solid #333;"> <strong style="color: #51cf66;">Total Modifiers:</strong> <span style="color: white; margin-left: 10px;"> Viewers: <<if _stream.modifiers.viewerMultiplier > 1>>+<</if>><<= Math.floor((_stream.modifiers.viewerMultiplier - 1) * 100)>>% </span> <span style="color: white; margin-left: 20px;"> Engagement: <<if _stream.modifiers.engagementMultiplier > 1>>+<</if>><<= Math.floor((_stream.modifiers.engagementMultiplier - 1) * 100)>>% </span> </div> <</if>> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">📺 Streaming System</h2> <!-- Follower Management --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Follower Count</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #9b59b6;">Current Followers:</strong> <span id="followerCount" style="color: #ffd43b; font-size: 18px; font-weight: bold; margin-left: 10px;"><<print $streamingData.followers || 0>></span> </div> <!-- Increase Followers --> <div style="margin-bottom: 15px;"> <p style="color: #51cf66; margin: 0 0 10px 0; font-weight: bold;">⬆️ Increase Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1</div>">> <<set $streamingData.followers += 1>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10</div>">> <<set $streamingData.followers += 10>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+100</div>">> <<set $streamingData.followers += 100>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1,000</div>">> <<set $streamingData.followers += 1000>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10,000</div>">> <<set $streamingData.followers += 10000>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+100,000</div>">> <<set $streamingData.followers += 100000>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> </div> </div> <!-- Decrease Followers --> <div style="margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0 0 10px 0; font-weight: bold;">⬇️ Decrease Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-1</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 1)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-10</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 10)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-100</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 100)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-1,000</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 1000)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-10,000</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 10000)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-100,000</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 100000)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> </div> </div> <!-- Reset/Set Specific Amount --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 500 (Streamer Job)</div>">> <<set $streamingData.followers = 500>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to 0</div>">> <<set $streamingData.followers = 0>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "MeetNeighbors">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">👥 Apartment Common Area</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> A cozy common area with comfortable seating and a large TV. Several of your neighbors are here, chatting and relaxing. </p> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("MeetNeighbors")>> <h2 style="color: #9b59b6;">Lounge</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 20px 0;">Some of your neighbors are also content creators!</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<if setup.isNPCAvailable(_npc.name)>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</if>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin: 0; text-align: center; font-style: italic;"> The common area is empty right now. No streamers are around. </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Apartments</div>">> <<goto "Apartments">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔞 PrawnHub</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <p style="color: white; font-size: 18px; margin: 0;"> Welcome to PrawnHub - the internet's premier adult entertainment platform. Browse content or stream your own. </p> </div> <h2 style="color: #ff1493;">Adult Entertainment Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Browse Content --> <div style="border: 3px solid #ff69b4; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff69b4; margin: 0 0 10px 0;">👀 Browse Content</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Watch adult videos and explore various categories.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Stream Yourself --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">📹 Stream Yourself</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Go live and earn money from viewers watching your stream.</p> <<if $hasWebcam>> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Go Live</div>">> <<goto "PrawnHubStream">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Webcam</div> <</if>> </div> <!-- Adult Stream Analytics --> <<if $prawnhubRegistered>> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">📊 PrawnHub Analytics</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">View your adult streaming statistics, earnings, and viewer metrics.</p> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>View Analytics</div>">> <<goto "PrawnHubAnalytics">> <</link>> </div> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHubStream">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔞 PrawnHub Streaming</h1> <!-- Registration Check --> <<if !$prawnhubRegistered>> <div style="padding: 30px; background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493; text-align: center;"> <h2 style="color: #ff1493; margin-bottom: 20px;">Welcome to PrawnHub Streaming!</h2> <p style="color: #ccc; font-size: 16px; margin-bottom: 25px;"> Ready to start your adult streaming career? Create your performer profile to begin earning from live streams. </p> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #ff69b4; margin-bottom: 20px;"> <h3 style="color: #ff69b4; margin-top: 0;">How It Works:</h3> <ul style="color: #aaa; text-align: left; line-height: 1.8;"> <li>Go live and perform for viewers</li> <li>Earn tips and donations during streams</li> <li>Build your follower base</li> <li>70% revenue share (you keep $0.70 per dollar earned)</li> <li>Stream up to 3 sessions per day</li> </ul> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Register as Performer</div>">> <<set $prawnhubRegistered = true>> <<goto "PrawnHubStream">> <</link>> </div> <<else>> <!-- Streaming Interface --> <div style="padding: 20px; background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <!-- Stats Display --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="background: #333; padding: 15px; border-radius: 8px; border: 1px solid #ff69b4;"> <div style="color: #ff69b4; font-size: 14px; margin-bottom: 5px;">👥 Followers</div> <div style="color: white; font-size: 24px; font-weight: bold;"><<print $prawnhubFollowers.toLocaleString()>></div> </div> <div style="background: #333; padding: 15px; border-radius: 8px; border: 1px solid #4ade80;"> <div style="color: #4ade80; font-size: 14px; margin-bottom: 5px;">💰 Total Earnings</div> <div style="color: white; font-size: 24px; font-weight: bold;">$<<print $prawnhubTotalEarnings.toFixed(2)>></div> </div> <div style="background: #333; padding: 15px; border-radius: 8px; border: 1px solid #fbbf24;"> <div style="color: #fbbf24; font-size: 14px; margin-bottom: 5px;">📹 Streams Today</div> <div style="color: white; font-size: 24px; font-weight: bold;"><<print $prawnhubSessionsToday>> / <<print $prawnhubMaxSessions>></div> </div> </div> <!-- Go Live Button --> <<if $prawnhubSessionsToday < $prawnhubMaxSessions>> <div style="text-align: center; margin: 30px 0;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 20px 50px; border-radius: 10px; font-weight: bold; font-size: 20px; box-shadow: 0 6px 12px rgba(255,20,147,0.4);'>🔴 GO LIVE</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <<else>> <div style="background: #4a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #ff6b6b; text-align: center; margin: 30px 0;"> <p style="color: #ff6b6b; font-size: 18px; font-weight: bold; margin: 0;"> ⚠️ Daily streaming limit reached (<<print $prawnhubMaxSessions>> sessions) </p> <p style="color: #aaa; margin: 10px 0 0 0;">Come back tomorrow to stream again!</p> </div> <</if>> <!-- Recent Streams --> <<if $prawnhubStreamHistory.length > 0>> <h3 style="color: #ff1493; margin-top: 30px;">Recent Streams</h3> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 1px solid #444;"> <<for _i = 0; _i < Math.min(5, $prawnhubStreamHistory.length); _i++>> <<set _stream = $prawnhubStreamHistory[$prawnhubStreamHistory.length - 1 - _i]>> <div style="padding: 10px; background: #333; margin-bottom: 10px; border-radius: 6px; border-left: 3px solid #ff1493;"> <div style="color: #ff69b4; font-weight: bold;">Day <<print _stream.day>></div> <div style="color: #aaa; font-size: 14px;"> Viewers: <<print _stream.viewers || 0>> | Earnings: $<<print (_stream.netEarnings || 0).toFixed(2)>> | New Followers: +<<print _stream.newFollowers>> </div> </div> <</for>> </div> <</if>> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHubLiveStream">> <!-- Initialize streaming session if not already started --> <<if !$currentPrawnStream>> <<set $currentPrawnStream = { active: true, startTime: $gameTime, totalMinutes: 0, maxMinutes: 480, viewers: Math.max(10, Math.floor($prawnhubFollowers * 0.15) + random(5, 20)), peakViewers: 0, baseEngagement: 45, currentEngagement: 45, earnings: 0, tips: 0, currentAction: null, actionTimeLeft: 0, actionsPerformed: [], clothingLayers: 3, specialAccessoryActive: false, startingFollowers: $prawnhubFollowers }>> <<set $currentPrawnStream.peakViewers = $currentPrawnStream.viewers>> <</if>> <!-- Action is running - advance time by 30 minutes --> <<if $currentPrawnStream.actionTimeLeft > 0>> <<set $currentPrawnStream.actionTimeLeft -= 30>> <<set $currentPrawnStream.totalMinutes += 30>> <<advancetime 30>> <!-- Calculate earnings for this 30-minute segment --> <<set _engagementMultiplier = $currentPrawnStream.currentEngagement / 100>> <<set _viewerTips = $currentPrawnStream.viewers * random(0.5, 2.5) * _engagementMultiplier>> <<set _playerShare = _viewerTips * 0.70>> <<set $currentPrawnStream.earnings += _playerShare>> <<set $currentPrawnStream.tips += Math.floor(random(1, 4))>> <!-- Viewer fluctuation --> <<set _viewerChange = random(-3, 8)>> <<set $currentPrawnStream.viewers = Math.max(5, $currentPrawnStream.viewers + _viewerChange)>> <<if $currentPrawnStream.viewers > $currentPrawnStream.peakViewers>> <<set $currentPrawnStream.peakViewers = $currentPrawnStream.viewers>> <</if>> <!-- Reset action if time is up --> <<if $currentPrawnStream.actionTimeLeft <= 0>> <<set $currentPrawnStream.currentAction = null>> <</if>> <</if>> <!-- Check chest and butt sizes --> <<set _hasChestSize = false>> <<if $bodyParts && $bodyParts.chest>> <<if ["medium", "large", "huge", "giant", "gigantic"].includes($bodyParts.chest)>> <<set _hasChestSize = true>> <</if>> <</if>> <<set _hasButtSize = false>> <<if $bodyParts && $bodyParts.butt>> <<if ["medium", "large", "huge", "giant", "gigantic"].includes($bodyParts.butt)>> <<set _hasButtSize = true>> <</if>> <</if>> <<set _hasBreasts = false>> <<if $bodyParts && $bodyParts.chest>> <<if ["small", "medium", "large", "huge", "giant", "gigantic"].includes($bodyParts.chest)>> <<set _hasBreasts = true>> <</if>> <</if>> <!-- Check for adult toys --> <<set _hasToy = false>> <<if $ownsFleshlight || $ownsDildo>> <<set _hasToy = true>> <</if>> <<set _hasOralToy = false>> <<if $ownsFleshlight || $ownsDildo>> <<set _hasOralToy = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 LIVE on PrawnHub</h1> <!-- Stream Stats Bar --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-bottom: 20px;"> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #ff69b4;"> <div style="color: #ff69b4; font-size: 12px;">👥 VIEWERS</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<print $currentPrawnStream.viewers>></div> </div> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #4ade80;"> <div style="color: #4ade80; font-size: 12px;">📊 ENGAGEMENT</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<print Math.round($currentPrawnStream.currentEngagement)>>%</div> </div> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #fbbf24;"> <div style="color: #fbbf24; font-size: 12px;">💰 EARNINGS</div> <div style="color: white; font-size: 20px; font-weight: bold;">$<<print $currentPrawnStream.earnings.toFixed(2)>></div> </div> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #c71585;"> <div style="color: #c71585; font-size: 12px;">⏱️ TIME LEFT</div> <div style="color: white; font-size: 20px; font-weight: bold;"> <<print Math.floor(($currentPrawnStream.maxMinutes - $currentPrawnStream.totalMinutes) / 60)>>h <<print ($currentPrawnStream.maxMinutes - $currentPrawnStream.totalMinutes) % 60>>m </div> </div> </div> <!-- Current Action Display --> <<if $currentPrawnStream.currentAction !== null>> <div style="background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px; text-align: center; border: 2px solid #ff69b4;"> <div style="color: white; font-size: 18px; font-weight: bold; margin-bottom: 10px;"> <<print $currentPrawnStream.currentAction.message>> </div> <div style="color: #ffe6f0; font-size: 16px;"> ⏰ Time Remaining: <<print $currentPrawnStream.actionTimeLeft>> minutes </div> </div> <</if>> <!-- Performance Actions Grid --> <<if $currentPrawnStream.totalMinutes < $currentPrawnStream.maxMinutes>> <h2 style="color: #ff1493; margin-bottom: 15px;">Performance Actions</h2> <div class="prawn-actions-grid"> <!-- STRIP CLOTHING --> <<set _hasStripped = $currentPrawnStream.actionsPerformed.includes("STRIP_CLOTHING")>> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && !_hasStripped>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>STRIP CLOTHING</div><div style='color: #aaa; font-size: 13px;'>Slowly remove each piece</div></div>">> <<goto "PrawnHub_Action01">> <</link>> <<elseif _hasStripped>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>STRIP CLOTHING ✓</div><div style='color: #8a6a6a; font-size: 13px;'>Already Used</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>STRIP CLOTHING</div><div style='color: #555; font-size: 13px;'>Slowly remove each piece</div></div> <</if>> </div> <!-- SIMULATE SEX --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasToy>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>SIMULATE SEX</div><div style='color: #aaa; font-size: 13px;'>Simulate sex with an adult toy</div></div>">> <<goto "PrawnHub_Action02">> <</link>> <<elseif !_hasToy>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>SIMULATE SEX 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Fleshlight or Dildo</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>SIMULATE SEX</div><div style='color: #555; font-size: 13px;'>Simulate sex with an adult toy</div></div> <</if>> </div> <!-- BREASTS CLAP --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasChestSize>> <<link "<div class='prawn-action-chest'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>BREASTS CLAP</div><div style='color: #aaa; font-size: 13px;'>Bounce them rhythmically</div></div>">> <<goto "PrawnHub_Action03">> <</link>> <<elseif !_hasChestSize>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>BREASTS CLAP 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Medium+ Chest</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>BREASTS CLAP</div><div style='color: #555; font-size: 13px;'>Bounce them rhythmically</div></div> <</if>> </div> <!-- ASS CLAP --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasButtSize>> <<link "<div class='prawn-action-butt'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>ASS CLAP</div><div style='color: #aaa; font-size: 13px;'>Make those cheeks jiggle</div></div>">> <<goto "PrawnHub_Action04">> <</link>> <<elseif !_hasButtSize>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>ASS CLAP 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Medium+ Butt</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>ASS CLAP</div><div style='color: #555; font-size: 13px;'>Make those cheeks jiggle</div></div> <</if>> </div> <!-- MASSAGE BREASTS --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasBreasts>> <<link "<div class='prawn-action-chest'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>MASSAGE BREASTS</div><div style='color: #aaa; font-size: 13px;'>Squeeze and caress them</div></div>">> <<goto "PrawnHub_Action05">> <</link>> <<elseif !_hasBreasts>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>MASSAGE BREASTS 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Small+ Chest</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>MASSAGE BREASTS</div><div style='color: #555; font-size: 13px;'>Squeeze and caress them</div></div> <</if>> </div> <!-- MASTURBATE --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>MASTURBATE</div><div style='color: #aaa; font-size: 13px;'>Touch yourself intimately</div></div>">> <<goto "PrawnHub_Action06">> <</link>> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>MASTURBATE</div><div style='color: #555; font-size: 13px;'>Touch yourself intimately</div></div> <</if>> </div> <!-- SIMULATE ORAL --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasOralToy>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>SIMULATE ORAL</div><div style='color: #aaa; font-size: 13px;'>Lick or suck a toy</div></div>">> <<goto "PrawnHub_Action07">> <</link>> <<elseif !_hasOralToy>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>SIMULATE ORAL 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Fleshlight or Dildo</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>SIMULATE ORAL</div><div style='color: #555; font-size: 13px;'>Lick or suck a toy</div></div> <</if>> </div> <!-- POSE NUDE --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasStripped>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>POSE NUDE</div><div style='color: #aaa; font-size: 13px;'>Display your naked body</div></div>">> <<goto "PrawnHub_Action08">> <</link>> <<elseif !_hasStripped>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>POSE NUDE 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Strip First</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>POSE NUDE</div><div style='color: #555; font-size: 13px;'>Display your naked body</div></div> <</if>> </div> <!-- MOAN --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>MOAN</div><div style='color: #aaa; font-size: 13px;'>Let out sexy sounds</div></div>">> <<goto "PrawnHub_Action11">> <</link>> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>MOAN</div><div style='color: #555; font-size: 13px;'>Let out sexy sounds</div></div> <</if>> </div> <!-- Empty slot for alignment --> <div class="prawn-action-container"></div> </div> <</if>> <!-- End Stream Button --> <div style="text-align: center; margin-top: 80px;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 15px 40px; border-radius: 8px; border: 3px solid #dc2626; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>❌ End Stream</div>">> <<goto "PrawnHubStreamEnd">> <</link>> </div> </div> <<timed 50ms>> <<script>> setupPrawnActionButtons(); <</script>> <</timed>> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHubStreamEnd">> <!-- Calculate final stats --> <<set _sessionEarnings = $currentPrawnStream.earnings>> <<set _avgEngagement = $currentPrawnStream.currentEngagement>> <<set _peakViewers = $currentPrawnStream.peakViewers>> <<set _actionsPerformed = $currentPrawnStream.actionsPerformed.slice()>> <<set _totalActions = _actionsPerformed.length>> <!-- Calculate new followers gained this session --> <<set _newFollowersThisSession = ($prawnhubFollowers || 0) - ($currentPrawnStream.startingFollowers || 0)>> <!-- Calculate platform cut based on job --> <<set _hasAdultStreamerJob = $jobs && $jobs.includes("Adult Streamer")>> <<set _platformCutPercent = _hasAdultStreamerJob ? 0.30 : 0.70>> <<set _grossEarnings = _sessionEarnings>> <<set _platformCut = Math.round(_grossEarnings * _platformCutPercent * 100) / 100>> <<set _netEarnings = Math.round((_grossEarnings - _platformCut) * 100) / 100>> <!-- Update player stats with net earnings --> <<set $money += _netEarnings>> <<set $prawnhubTotalEarnings += _netEarnings>> <<set $prawnhubSessionsToday += 1>> <!-- Check for job transition --> <<set _becameAdultStreamer = false>> <<set _canBecomeAdultStreamer = false>> <<set _hasOtherJob = $jobs && $jobs.length > 0 && !$jobs.includes("Unemployed") && !$jobs.includes("Adult Streamer")>> <<if $prawnhubFollowers >= 500 && !_hasAdultStreamerJob>> <<if !$jobs || $jobs.length === 0 || $jobs.includes("Unemployed")>> <!-- Auto-assign Adult Streamer job if unemployed --> <<set $jobs = ["Adult Streamer"]>> <<set _becameAdultStreamer = true>> <<else>> <!-- Has other job, give choice --> <<set _canBecomeAdultStreamer = true>> <</if>> <</if>> <!-- Save to history --> <<if !$prawnhubStreamHistory>> <<set $prawnhubStreamHistory = []>> <</if>> <<set $prawnhubStreamHistory.push({ day: $dayNumber, viewers: _peakViewers, grossEarnings: _grossEarnings, platformCut: _platformCut, netEarnings: _netEarnings, newFollowers: _newFollowersThisSession, engagement: _avgEngagement, duration: $currentPrawnStream.totalMinutes, actionsPerformed: _actionsPerformed })>> <!-- Clean up --> <<set $currentPrawnStream = null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">📊 Stream Summary</h1> <div style="max-width: 800px; margin: 0 auto;"> <!-- Job Transition Messages --> <<if _becameAdultStreamer>> <div style="background: linear-gradient(135deg, #27ae60 0%, #229954 100%); padding: 25px; border-radius: 12px; border: 3px solid #27ae60; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(39, 174, 96, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">🎉 Congratulations!</h2> <p style="color: #ffd; font-size: 18px; margin: 0;"> You've reached 500 followers! Your job is now <strong>Adult Streamer</strong>!<br> Platform cut reduced from 70% to 30%! </p> </div> <<elseif _canBecomeAdultStreamer>> <div style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: white; margin: 0 0 15px 0;">💼 Job Opportunity</h2> <p style="color: #ffd; font-size: 16px; margin: 0 0 15px 0;"> You've reached 500 followers! Would you like to quit your current job (<<print $jobs.join(", ")>>) and become a full-time Adult Streamer?<br> <span style="font-size: 14px;">(Platform cut will be reduced from 70% to 30%)</span> </p> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='display: inline-block; background: #27ae60; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✓ Become Adult Streamer</div>">> <<set $jobs = ["Adult Streamer"]>> <<goto "PrawnHubStreamEnd">> <</link>> <<link "<div style='display: inline-block; background: #7f8c8d; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✗ Keep Current Job</div>">> <<goto "PrawnHubStreamEnd">> <</link>> </div> </div> <</if>> <!-- Summary Card --> <div style="background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; border: 2px solid #ff1493; margin-bottom: 25px;"> <h2 style="color: #ff1493; text-align: center; margin-bottom: 25px;">Stream Complete!</h2> <!-- Stats Grid --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #4ade80;"> <div style="color: #4ade80; font-size: 14px; margin-bottom: 8px;">💰 NET EARNINGS</div> <div style="color: white; font-size: 28px; font-weight: bold;">$<<print _netEarnings.toFixed(2)>></div> <div style="color: #aaa; font-size: 12px; margin-top: 5px;">(After platform cut)</div> </div> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #ff69b4;"> <div style="color: #ff69b4; font-size: 14px; margin-bottom: 8px;">👥 PEAK VIEWERS</div> <div style="color: white; font-size: 28px; font-weight: bold;"><<print _peakViewers>></div> </div> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #fbbf24;"> <div style="color: #fbbf24; font-size: 14px; margin-bottom: 8px;">📊 AVG ENGAGEMENT</div> <div style="color: white; font-size: 28px; font-weight: bold;"><<print Math.round(_avgEngagement)>>%</div> </div> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #60a5fa;"> <div style="color: #60a5fa; font-size: 14px; margin-bottom: 8px;">➕ NEW FOLLOWERS</div> <div style="color: white; font-size: 28px; font-weight: bold;">+<<print _newFollowersThisSession>></div> </div> </div> <!-- Earnings Breakdown --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #444; margin-bottom: 20px;"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">💰 Earnings Breakdown</h3> <div style="color: #aaa; line-height: 1.8;"> <p style="margin: 5px 0;"><strong>Gross Tips:</strong> <span style="color: #51cf66;">$<<print _grossEarnings.toFixed(2)>></span></p> <p style="margin: 5px 0;"><strong>Platform Cut (<<print Math.round(_platformCutPercent * 100)>>%):</strong> <span style="color: #e74c3c;">-$<<print _platformCut.toFixed(2)>></span></p> <p style="margin: 5px 0; padding-top: 10px; border-top: 2px solid #444;"><strong>Net Earnings:</strong> <span style="color: #ffd43b; font-size: 18px;">$<<print _netEarnings.toFixed(2)>></span></p> </div> <<if !_hasAdultStreamerJob>> <div style="background: #3a2020; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #e74c3c;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> ⚠️ <strong>High Platform Fee!</strong> Get the Adult Streamer job to reduce the platform cut from 70% to 30%. </p> </div> <</if>> </div> <!-- Actions Performed --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #444;"> <h3 style="color: #ff69b4; margin-top: 0;">Actions Performed: <<print _totalActions>></h3> <div style="color: #aaa; line-height: 1.8;"> <<if _totalActions > 0>> <<for _i = 0; _i < _totalActions; _i++>> <<set _actionName = _actionsPerformed[_i]>> <<set _displayName = _actionName.replace(/_/g, " ")>> <span style="background: #333; padding: 5px 10px; border-radius: 5px; margin: 3px; display: inline-block; border: 1px solid #ff1493;"> <<print _displayName>> </span> <</for>> <<else>> <span style="color: #666;">No actions performed</span> <</if>> </div> </div> </div> <!-- Career Progress --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #ff69b4; margin-bottom: 25px;"> <h3 style="color: #ff69b4; margin-top: 0;">Career Stats</h3> <div style="color: #aaa;"> <p>💰 Total Career Earnings: <span style="color: #4ade80; font-weight: bold;">$<<print $prawnhubTotalEarnings.toFixed(2)>></span></p> <p>👥 Total Followers: <span style="color: #ff69b4; font-weight: bold;"><<print ($prawnhubFollowers || 0).toLocaleString()>></span></p> <p>📹 Streams Today: <span style="color: #fbbf24; font-weight: bold;"><<print $prawnhubSessionsToday>> / <<print $prawnhubMaxSessions>></span></p> <<if _hasAdultStreamerJob>> <p>💼 Current Job: <span style="color: #27ae60; font-weight: bold;">Adult Streamer</span> (30% platform cut)</p> <<else>> <p>💼 Current Job: <span style="color: #e74c3c; font-weight: bold;"><<if $jobs && $jobs.length > 0>><<print $jobs.join(", ")>><<else>>Unemployed<</if>></span> (70% platform cut)</p> <</if>> </div> </div> </div> <!-- Navigation --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin: 0 10px;'>Back to Streaming</div>">> <<goto "PrawnHubStream">> <</link>> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin: 0 10px;'>Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action02">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 20, strength: 20}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<if !$action02Choice>> <<set $action02Choice = null>> <<set $action02Result = null>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 SIMULATE SEX: Use Handheld Prop</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 20>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 20 Required </div> <div class="stat-requirement <<if _effectiveStr >= 20>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 20 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action02Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎮 Play Timing Game</div>">> <<set $action02Choice = "game">> <<goto "PrawnHub_Action02">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action02Choice = "roll">> <<set $action02Result = random(1, 100) + _bonus>> <<goto "PrawnHub_Action02">> <</link>> </div> <<elseif $action02Choice == "game" && !$action02Result>> <!-- Oscillating Bar Game --> <<set _meetsRequirements = _effectiveDex >= 20 && _effectiveStr >= 20>> <<set _traitCount = 0>> <<for _i = 0; _i < _positiveTraits.positive.length; _i++>> <<set _trait = _positiveTraits.positive[_i]>> <<if ($physicalTraits && $physicalTraits.includes(_trait)) || ($mentalTraits && $mentalTraits.includes(_trait)) || ($skills && $skills.includes(_trait))>> <<set _traitCount++>> <</if>> <</for>> <<set $barSpeed = _meetsRequirements ? Math.max(2.0, 3.0 - (_traitCount * 0.1)) : 10.0>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;">Click when the bar reaches the top! (3 attempts)</p> <p style="color: #aaa; font-size: 14px; margin-bottom: 20px;">Score 75+ on each attempt for maximum effect!</p> <!-- Inline styled game container --> <div id="oscillatingGame" style="width: 300px; max-width: 300px; height: 600px; position: relative; margin: 20px auto; cursor: pointer;"> <!-- Inner game area with background --> <div style="position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 150px; height: 400px; background: #2a2a2a; border: 2px solid #ff1493; border-radius: 8px;"></div> <!-- Track --> <div class="oscillating-track" style="position: absolute; left: 50%; top: 110px; bottom: 110px; width: 30px; background: #444; transform: translateX(-50%); border-radius: 15px;"></div> <!-- Fill Bar --> <div class="oscillating-fill" style="position: absolute; left: 50%; bottom: 110px; width: 30px; height: 0px; max-height: 380px; background: rgba(255, 255, 255, 0.9); transform: translateX(-50%); transition: height 0.3s ease; border-radius: 15px; z-index: 1;"></div> <!-- Target Zone --> <div class="target-zone" style="position: absolute; left: 50%; top: 110px; width: 30px; height: 50px; background: rgba(74, 222, 128, 0.3); transform: translateX(-50%); border: 2px solid #4ade80; border-radius: 15px 15px 0 0; z-index: 2;"></div> <!-- Moving Bar --> <div class="oscillating-bar" style="position: absolute; left: 50%; bottom: 110px; width: 30px; height: 40px; background: #e8a5bc; transform: translateX(-50%); box-shadow: 0 0 10px rgba(232, 165, 188, 0.7); border-radius: 20px; z-index: 3;"></div> <!-- Particle Container --> <div class="particle-container" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; z-index: 10;"></div> </div> </div> <<timed 100ms>> <<script>> console.log("Timed script running!"); console.log("initOscillatingBar function exists?", typeof initOscillatingBar); console.log("Bar speed:", State.variables.barSpeed); if (typeof initOscillatingBar === 'function') { console.log("Calling initOscillatingBar now..."); initOscillatingBar('oscillatingGame', State.variables.barSpeed, function(score) { console.log("Callback received with score:", score); State.variables.action02Result = score; Engine.play(passage()); }); } else { console.error("initOscillatingBar function not found!"); } <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action02Choice == "roll">> <<set _success = $action02Result >= 50>> <<set _score = Math.min(100, $action02Result)>> <<else>> <<set _success = $action02Result >= 80>> <<set _score = $action02Result>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $action02Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> d100 Roll: <<print $action02Result>> (Modified) </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 8)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <</if>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Excellent use of the toy! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((80 - _score) / 10)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <</if>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ A bit clumsy with the prop... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _viewers = $currentPrawnStream ? $currentPrawnStream.viewers : 0>> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, _viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, _viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<if $currentPrawnStream>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <</if>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer02" class="prawn-chat-container"></div> <<if (_tipResult && _tipResult.count > 0) || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult && _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.temporary.score || 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'SIMULATE_SEX', viewers); window.displayPrawnChat('prawnChatContainer02', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "SIMULATE_SEX", message: "Simulating sex…" }>> <<set $currentPrawnStream.actionTimeLeft = 15>> <<set $currentPrawnStream.actionsPerformed.push("SIMULATE_SEX")>> <</if>> <<set $action02Choice = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action03">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 15, strength: 15}>> <<set _positiveTraits = { positive: ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <!-- Count positive traits for bar speed --> <<set _traitCount = 0>> <<if $traits>> <<for _trait range ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"]>> <<if $traits[_trait]>> <<set _traitCount++>> <</if>> <</for>> <</if>> <<set _meetsRequirements = _effectiveDex >= 15 && _effectiveStr >= 15>> <<set $barSpeed = _meetsRequirements ? Math.max(2.0, 3.0 - (_traitCount * 0.1)) : 8.0>> <<if !$action03Choice>> <<set $action03Choice = null>> <<set $action03Result = null>> <<set $action03Scores = []>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 BREASTS CLAP: Upper Rhythm Display</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 15>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 15 Required </div> <div class="stat-requirement <<if _effectiveStr >= 15>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 15 Required </div> <div style="color: #aaa; margin-top: 10px;"> Positive Traits: <<print _traitCount>> (Bar Speed: <<print $barSpeed.toFixed(1)>>x) </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action03Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎮 Play Rhythm Game (3 attempts)</div>">> <<set $action03Choice = "game">> <<goto "PrawnHub_Action03">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action03Choice = "roll">> <<set _rollResult = random(1, 100) + _bonus>> <<set $action03Result = {roll: random(1, 100), bonus: _bonus, total: _rollResult}>> <<goto "PrawnHub_Action03">> <</link>> </div> <<elseif $action03Choice == "game" && !$action03Result>> <!-- Moving Bar Game --> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;"> Click when the bar is in the green zone! (3 attempts in one round) </p> <div id="movingBarGame" class="bar-game-container"> <div class="bar-track"></div> <div class="bar-indicator"></div> <div class="moving-bar"></div> </div> </div> <<timed 250ms>> <<script>> initMovingBar('movingBarGame', State.variables.barSpeed, function(avgScore) { State.variables.action03Result = {total: avgScore}; Engine.play(passage()); }); <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action03Choice == "roll">> <<set _score = $action03Result.total>> <<set _success = _score >= 50>> <<else>> <<set _score = $action03Result.total>> <<set _success = _score >= 50>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $action03Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action03Result.roll>> + Bonus: <<print $action03Result.bonus>> </div> <<else>> <div style="color: #aaa; margin: 10px 0;"> Average Score from 3 attempts </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 6)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <</if>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Perfect rhythm! Viewers are captivated! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - _score) / 8)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <</if>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The rhythm was off... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer03" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = Math.round(State.temporary.score || 0); var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'BREASTS_CLAP', viewers); window.displayPrawnChat('prawnChatContainer03', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "BREASTS_CLAP", message: "Performing breast clapping motion!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("BREASTS_CLAP")>> <</if>> <<set $action03Choice = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action04">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 15, strength: 15}>> <<set _positiveTraits = { positive: ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <!-- Count positive traits for bar speed --> <<set _traitCount = 0>> <<if $traits>> <<for _trait range ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"]>> <<if $traits[_trait]>> <<set _traitCount++>> <</if>> <</for>> <</if>> <<set _meetsRequirements = _effectiveDex >= 15 && _effectiveStr >= 15>> <<set $barSpeed = _meetsRequirements ? Math.max(2.0, 3.0 - (_traitCount * 0.1)) : 8.0>> <<set $action04Choice = $action04Choice || null>> <<set $action04Result = $action04Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ASS CLAP: Lower Rhythm Display</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 15>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 15 Required </div> <div class="stat-requirement <<if _effectiveStr >= 15>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 15 Required </div> <div style="color: #aaa; margin-top: 10px;"> Positive Traits: <<print _traitCount>> (Bar Speed: <<print $barSpeed.toFixed(1)>>x) </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action04Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎮 Play Rhythm Game (3 attempts)</div>">> <<set $action04Choice = "game">> <<goto "PrawnHub_Action04">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action04Choice = "roll">> <<set _rollValue = random(1, 100)>> <<set $action04Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<goto "PrawnHub_Action04">> <</link>> </div> <<elseif $action04Choice == "game" && !$action04Result>> <!-- Moving Bar Game --> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;"> Click when the bar is in the green zone! (3 attempts in one round) </p> <div id="movingBarGame04" class="bar-game-container"> <div class="bar-track"></div> <div class="bar-indicator"></div> <div class="moving-bar"></div> </div> </div> <<timed 250ms>> <<script>> initMovingBar('movingBarGame04', State.variables.barSpeed, function(avgScore) { State.variables.action04Result = {total: avgScore}; Engine.play(passage()); }); <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action04Choice == "roll">> <<set _score = $action04Result.total>> <<set _success = _score >= 50>> <<else>> <<set _score = $action04Result.total>> <<set _success = _score >= 50>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $action04Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action04Result.roll>> + Bonus: <<print $action04Result.bonus>> </div> <<else>> <div style="color: #aaa; margin: 10px 0;"> Average Score from 3 attempts </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 6)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <</if>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Amazing movement! Viewers can't look away! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - _score) / 8)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <</if>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The movement wasn't quite right... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer04" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = Math.round(State.temporary.score || 0); var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'ASS_CLAP', viewers); window.displayPrawnChat('prawnChatContainer04', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "ASS_CLAP", message: "Performing ass clapping motion!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("ASS_CLAP")>> <</if>> <<set $action04Choice = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action05">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 15, strength: 15}>> <<set _positiveTraits = { positive: ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <!-- Count positive traits for required score reduction --> <<set _traitCount = 0>> <<if $traits>> <<for _trait range ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"]>> <<if $traits[_trait]>> <<set _traitCount++>> <</if>> <</for>> <</if>> <<set _requiredScore = Math.max(50, 80 - (_traitCount * 3))>> <<set $action05Choice = $action05Choice || null>> <<set $action05Result = $action05Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_05: Upper Body Focus</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 15>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 15 Required </div> <div class="stat-requirement <<if _effectiveStr >= 15>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 15 Required </div> <div style="color: #aaa; margin-top: 10px;"> Positive Traits: <<print _traitCount>> (Required Score: <<print _requiredScore>>) </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action05Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎨 Draw a Circle</div>">> <<set $action05Choice = "draw">> <<goto "PrawnHub_Action05">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action05Choice = "roll">> <<set _rollValue = random(1, 100)>> <<set $action05Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<goto "PrawnHub_Action05">> <</link>> </div> <<elseif $action05Choice == "draw" && !$action05Result>> <!-- Circle Drawing Game --> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;"> Draw a smooth circle with your mouse! (Required Score: <<print _requiredScore>>) </p> <canvas id="circleCanvas" class="circle-canvas" width="400" height="400"></canvas> </div> <<timed 250ms>> <<script>> initCircleDrawing('circleCanvas', function(score) { State.variables.action05Result = {total: score}; Engine.play(passage()); }); <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action05Choice == "roll">> <<set _score = $action05Result.total>> <<else>> <<set _score = $action05Result.total>> <</if>> <<set _success = _score >= _requiredScore>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $action05Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action05Result.roll>> + Bonus: <<print $action05Result.bonus>> </div> <<else>> <div style="color: #aaa; margin: 10px 0;"> Circle Quality Score </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 7)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Beautiful movement! So graceful! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((_requiredScore - _score) / 10)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ A bit shaky... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer05" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = Math.round(State.temporary.score || 0); var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'MASSAGE_BREASTS', viewers); window.displayPrawnChat('prawnChatContainer05', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "MASSAGE_BREASTS", message: "Sensually massaging and caressing breasts for viewers!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("MASSAGE_BREASTS")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action05Choice = null>> <<set $action05Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action06">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 10, strength: 10}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $action06Performed = $action06Performed || false>> <<set $action06Result = $action06Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_06: Personal Expression Pose</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 10>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 10 Required </div> <div class="stat-requirement <<if _effectiveStr >= 10>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 10 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action06Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Express yourself in your own unique way! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action06Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action06Performed = true>> <<goto "PrawnHub_Action06">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action06Result.total >= 50>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action06Result.roll>> + Bonus: <<print $action06Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action06Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action06Result.total / 7)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Your personal touch is captivating! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action06Result.total) / 8)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The expression felt forced... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action06Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action06Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer06" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action06Result ? State.variables.action06Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'MASTURBATE', viewers); window.displayPrawnChat('prawnChatContainer06', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "MASTURBATE", message: "Pleasuring myself intimately for the audience!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("MASTURBATE")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action06Performed = false>> <<set $action06Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action07">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {strength: 20}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $action07Performed = $action07Performed || false>> <<set $action07Result = $action07Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_07: Prop Interaction</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveStr >= 20>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 20 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action07Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Show the viewers how you handle your prop! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action07Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action07Performed = true>> <<goto "PrawnHub_Action07">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action07Result.total >= 50>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action07Result.roll>> + Bonus: <<print $action07Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action07Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action07Result.total / 6)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Masterful prop work! Incredible! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action07Result.total) / 7)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The prop handling was awkward... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action07Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action07Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer07" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action07Result ? State.variables.action07Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'SIMULATE_ORAL', viewers); window.displayPrawnChat('prawnChatContainer07', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "SIMULATE_ORAL", message: "Demonstrating skilled oral techniques with prop!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("SIMULATE_ORAL")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action07Performed = false>> <<set $action07Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action08">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {charisma: 30}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set $action08Performed = $action08Performed || false>> <<set $action08Result = $action08Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_08: Front Presentation</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveCha >= 30>>met<<else>>not-met<</if>>"> Charisma: <<print _effectiveCha>> / 30 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action08Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Face the camera and show your charm! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action08Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action08Performed = true>> <<goto "PrawnHub_Action08">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action08Result.total >= 50>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action08Result.roll>> + Bonus: <<print $action08Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action08Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action08Result.total / 8)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Your charisma shines through! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action08Result.total) / 10)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ You seemed a bit stiff... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action08Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action08Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer08" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action08Result ? State.variables.action08Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'POSE_NUDE', viewers); window.displayPrawnChat('prawnChatContainer08', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "POSE_NUDE", message: "Displaying nude body in provocative poses!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("POSE_NUDE")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action08Performed = false>> <<set $action08Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action11">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {charisma: 10, dexterity: 10, strength: 10}>> <!-- Check for all voice traits --> <<set _voiceBonus = 0>> <<if $traits>> <!-- Positive voice traits --> <<if $traits["Smooth Voice"]>><<set _voiceBonus += 5>><</if>> <<if $traits["Deep Voice"]>><<set _voiceBonus += 5>><</if>> <<if $traits["Melodic Voice"]>><<set _voiceBonus += 5>><</if>> <<if $traits["Sultry Voice"]>><<set _voiceBonus += 7>><</if>> <<if $traits["Commanding Voice"]>><<set _voiceBonus += 5>><</if>> <!-- Negative voice traits --> <<if $traits["Raspy Voice"]>><<set _voiceBonus -= 5>><</if>> <<if $traits["Nasally Voice"]>><<set _voiceBonus -= 5>><</if>> <<if $traits["Squeaky Voice"]>><<set _voiceBonus -= 5>><</if>> <<if $traits["Monotone Voice"]>><<set _voiceBonus -= 5>><</if>> <</if>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits) + _voiceBonus>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $action11Performed = $action11Performed || false>> <<set $action11Result = $action11Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_11: Voice + Movement Combo</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if $stats.charisma >= 10>>met<<else>>not-met<</if>>"> Charisma: <<print $stats.charisma>> / 10 Required </div> <div class="stat-requirement <<if _effectiveDex >= 10>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 10 Required </div> <div class="stat-requirement <<if _effectiveStr >= 10>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 10 Required </div> <<if _voiceBonus != 0>> <div style="color: <<if _voiceBonus > 0>>#4ade80<<else>>#ff6b6b<</if>>; margin-top: 10px;"> Voice Traits: <<if _voiceBonus > 0>>+<</if>><<print _voiceBonus>> </div> <</if>> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action11Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Combine your voice and movement for maximum effect! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action11Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action11Performed = true>> <<goto "PrawnHub_Action11">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action11Result.total >= 50>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action11Result.roll>> + Bonus: <<print $action11Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action11Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action11Result.total / 5)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ The perfect combination! Viewers are mesmerized! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action11Result.total) / 8)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The coordination was off... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action11Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action11Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer11" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action11Result ? State.variables.action11Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'MOAN', viewers); window.displayPrawnChat('prawnChatContainer11', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "MOAN", message: "Moaning seductively with sensual movements!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("MOAN")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action11Performed = false>> <<set $action11Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action01">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 30}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective dexterity for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set $action01Performed = $action01Performed || false>> <<set $action01Result = $action01Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 STRIP CLOTHING: Change Outfit State</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 30>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 30 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action01Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Time to change your outfit and show the viewers something new! </p> <<link "<div class='action-choice-btn'>🎲 Roll Performance Check (d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action01Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action01Performed = true>> <<goto "PrawnHub_Action01">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action01Result.total >= 50>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action01Result.roll>> + Bonus: <<print $action01Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action01Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action01Result.total / 10)>> <<set _earningsMultiplier = 1 + ($action01Result.total / 200)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Success! The viewers love your new look! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% | Earning Multiplier: x<<print _earningsMultiplier.toFixed(2)>> </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action01Result.total) / 5)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The outfit change was awkward... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action01Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action01Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action01Result ? State.variables.action01Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'STRIP_CLOTHING', viewers); window.displayPrawnChat('prawnChatContainer', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<set $currentPrawnStream.currentAction = { id: "STRIP_CLOTHING", message: "Stripping clothing…" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("STRIP_CLOTHING")>> <<set $action01Performed = false>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<script>> // Prawn Chat Usernames with colors window.prawnChatUsers = [ {name: "HornyHousewife88", color: "#ff69b4"}, {name: "OneHandDad69", color: "#4169e1"}, {name: "CuriousBiWife", color: "#ff1493"}, {name: "BrokeButStroking", color: "#32cd32"}, {name: "MilfLovesYoungCock", color: "#ff4500"}, {name: "WifeAsleepAgain", color: "#9370db"}, {name: "TouchingMyselfQuietly", color: "#ff69b4"}, {name: "SilentLurkerXX", color: "#808080"}, {name: "HubbyDoesntKnow99", color: "#ff1493"}, {name: "JustHereForGirls", color: "#da70d6"}, {name: "SneakyMomOf3", color: "#ff6347"}, {name: "EdgingInBedroom", color: "#4682b4"}, {name: "ShowFeetPrettyPls", color: "#ffa500"}, {name: "MarriedButBiCurious", color: "#ba55d3"}, {name: "CantCumButWet", color: "#ff69b4"}, {name: "OneHandTypingF", color: "#ff1493"}, {name: "HotelRoomHorny", color: "#4169e1"}, {name: "MoanForMeBaby", color: "#ff4500"}, {name: "ParentsDownstairs24F", color: "#ff69b4"}, {name: "FreeUserFapperM", color: "#696969"}, {name: "WatchingWithHubby", color: "#9370db"}, {name: "PmMeYourPussy", color: "#ff1493"}, {name: "InBathroomAtWorkF", color: "#ff6347"}, {name: "GirlfriendAsleepNextToMe", color: "#4682b4"}, {name: "TouchingUnderBlanket", color: "#ff69b4"}, {name: "BiWifeWatchingAlone", color: "#da70d6"}, {name: "OnTheToiletStroking", color: "#32cd32"}, {name: "HornyAndBoredWife", color: "#ff1493"}, {name: "ShowAssholeQueen", color: "#ff4500"}, {name: "LurkingWithVibrator", color: "#ff69b4"}, {name: "SneakyCollegeGirl", color: "#ff1493"}, {name: "WifeThinksImSleeping", color: "#4169e1"}, {name: "FingeringInDark", color: "#9370db"}, {name: "CuriousStraightGirl", color: "#ff69b4"}, {name: "EarbudsInMaxF", color: "#ff6347"}, {name: "JustWokeUpHardM", color: "#4682b4"}, {name: "PmYourSnapPretty", color: "#ff1493"}, {name: "CoupleLookingForGirl", color: "#ba55d3"}, {name: "Volume0Vibes100F", color: "#ff69b4"}, {name: "CantCumYetEdging", color: "#4169e1"}, {name: "MomMightWalkInM", color: "#32cd32"}, {name: "SecretlyBiHubby", color: "#4682b4"}, {name: "TouchingMyselfToYou", color: "#ff69b4"}, {name: "InCarWaitingForKids", color: "#ff1493"}, {name: "HornyStepMomVibes", color: "#ff4500"}, {name: "OneHandChallengeM", color: "#4169e1"}, {name: "WatchingWithGFAsleep", color: "#9370db"}, {name: "FreeAccountGangM", color: "#696969"}, {name: "BiGirlLovesTits", color: "#da70d6"}, {name: "HotelWifiWanker", color: "#4682b4"}, {name: "SneakyWifeTouching", color: "#ff69b4"}, {name: "CuriousAboutGirls19", color: "#ff1493"}, {name: "RoommateInNextRoomM", color: "#32cd32"}, {name: "FingeringToYourVoice", color: "#ff69b4"}, {name: "BrokeButLoyalM", color: "#696969"}, {name: "MarriedButWatchingF", color: "#ff6347"}, {name: "ShowToesOrBye", color: "#ffa500"}, {name: "CoupleLookingForUnicorn", color: "#ba55d3"}, {name: "OnCompanyWifiM", color: "#4682b4"}, {name: "HornyAndSingleMom", color: "#ff1493"}, {name: "TypingWithLeftHandM", color: "#4169e1"}, {name: "BiWifePmMe", color: "#da70d6"}, {name: "BananaBananaBananaBanana", color: "#f0f24e"}, {name: "SilentButSoaked", color: "#9370db"}, {name: "InPublicLibraryM", color: "#32cd32"}, {name: "PillowOverFaceF", color: "#ff69b4"}, {name: "CouplePmUs", color: "#ba55d3"}, {name: "EarbudsSavingMeM", color: "#4682b4"}, {name: "SneakyMasturbatorF", color: "#ff69b4"}, {name: "JustAnotherLurkerM", color: "#808080"}, {name: "HornyTeacherAfterClass", color: "#ff1493"}, {name: "WatchingWithBoyfriend", color: "#9370db"}, {name: "NormalGuy", color: "#696969"}, {name: "BiAndBoredTonight", color: "#da70d6"}, {name: "5MinTillHubbyHome", color: "#ff4500"}, {name: "LurkingHardM", color: "#4169e1"}, {name: "TouchingInBedF", color: "#ff69b4"}, {name: "CantCumButHardM", color: "#4682b4"}, {name: "CuriousLesbianFirstTime", color: "#ff1493"}, {name: "OnMomsPhoneM", color: "#32cd32"}, {name: "WifeWatchingWithMe", color: "#9370db"}, {name: "SneakyVibesOn", color: "#ff69b4"}, {name: "InTheDarkStrokingM", color: "#4169e1"}, {name: "HornyAndNeglectedWife", color: "#ff1493"}, {name: "ShowBobsPlsM", color: "#ffa500"}, {name: "BiGirlInLingerie", color: "#da70d6"}, {name: "HeadphonesInClassF", color: "#ff69b4"}, {name: "OneHandLegendM", color: "#4682b4"}, {name: "WatchingWhileHeSleeps", color: "#ff6347"}, {name: "FreeUserEnergyM", color: "#696969"}, {name: "SecretlyWatchingGirls", color: "#9370db"}, {name: "VibratorOnLow", color: "#ff69b4"}, {name: "MarriedButCuriousF", color: "#ff1493"}, {name: "LurkerSince2019M", color: "#808080"}, {name: "SneakyClitRubs", color: "#ff69b4"}, {name: "CantTalkTypingM", color: "#4682b4"}, {name: "HornyAuntieVibes", color: "#ff4500"}, {name: "BiWifeNeedsFriends", color: "#da70d6"}, {name: "OnLunchBreakFapM", color: "#32cd32"}, {name: "TouchingToYourCam", color: "#ff69b4"}, {name: "BrokeCollegeGirlWet", color: "#ff1493"}, {name: "SilentStrokerM", color: "#808080"}, {name: "WatchingWithWife", color: "#9370db"}, {name: "CuriousAndSingleF", color: "#ff69b4"}, {name: "EarbudsInBedM", color: "#4682b4"}, {name: "PillowHumpingTonight", color: "#ff1493"}, {name: "HornyAndHomeAloneF", color: "#ff69b4"}, {name: "FreeLoaderGang", color: "#696969"}, {name: "CoupleWatchingTogether", color: "#ba55d3"}, {name: "SneakyFingerInPanties", color: "#ff69b4"}, {name: "BiAndTipsyTonight", color: "#da70d6"}, {name: "OneHandedViewerM", color: "#4169e1"}, {name: "WatchingOnSilentF", color: "#ff69b4"}, {name: "CantCumButThrobM", color: "#4682b4"}, {name: "HornyMilfNextDoor", color: "#ff1493"}, {name: "CoupleLookingForFun", color: "#ba55d3"}, {name: "LurkingWithToy", color: "#9370db"}, {name: "InBedWithHeadphonesF", color: "#ff69b4"}, {name: "SecretBiHubby", color: "#4682b4"}, {name: "TouchingMyselfSoftly", color: "#ff69b4"}, {name: "CuriousFirstTimerF", color: "#ff1493"}, {name: "OnTheBusHornyM", color: "#32cd32"}, {name: "WifeDoesntKnowIFap", color: "#4169e1"}, {name: "VibratorUnderBlanket", color: "#ff69b4"}, {name: "FreeUserButWet", color: "#696969"}, {name: "CoupleWatchingHot", color: "#ba55d3"}, {name: "JustAnotherHornySoul", color: "#9370db"}, {name: "SneakyOfficeWankM", color: "#4682b4"}, {name: "BiGirlCravingAttention", color: "#da70d6"}, {name: "WatchingFromWorkF", color: "#ff69b4"}, {name: "MomHomeAloneHorny", color: "#ff1493"}, {name: "OneHandBathroomBreak", color: "#4169e1"}, {name: "CuriousNeighborGirl", color: "#ff69b4"}, {name: "HusbandAsleepWatching", color: "#9370db"}, {name: "FingeringInShowerF", color: "#ff69b4"}, {name: "BrokeStudentStroking", color: "#696969"}, {name: "LurkingInShadowsM", color: "#808080"}, {name: "TouchingToYourMoans", color: "#ff69b4"}, {name: "MarriedCoupleCurious", color: "#ba55d3"}, {name: "SilentVibeSessionF", color: "#9370db"}, {name: "OnBreakAtGymHorny", color: "#32cd32"}, {name: "WifeWatchingSecretly", color: "#ff1493"}, {name: "BiAndHornyTonight", color: "#da70d6"}, {name: "PillowRidingHard", color: "#ff69b4"}, {name: "FreeViewerForeverM", color: "#696969"}, {name: "SneakySisterVibes", color: "#ff69b4"}, {name: "EarbudsInPublicF", color: "#ff69b4"}, {name: "CantStopStrokingM", color: "#4682b4"}, {name: "HornyAndBoredMom", color: "#ff1493"}, {name: "CoupleGoalWatchers", color: "#ba55d3"} ]; // Chat messages organized by action and score tier window.prawnChatMessages = { STRIP_CLOTHING: { tier1: [ // 95+ "omg yesss", "fuck ur so good at this", "im so hard rn", "best strip ive ever seen", "holy shit dont stop", "FUCK YES", "im gonna cum watching", "this is perfect", "god damn that tease", "ur making me so wet", "i need more", "so fucking sexy", "youre incredible", "best stripper on here", "cant stop watching", "holy fuck yes", "take it all off baby", "so hot baby", "dont fucking stop", "i wish i was there", "fucking perfect body", "best strip ever", "im edging so hard", "need to see everything", "god yes strip for me", "so good at teasing", "making me throb", "cant handle this", "stroking so hard rn", "youre a goddess", "im so turned on", "fuck me please", "please show more", "best tease ever", "losing my mind", "so fucking hot", "im about to finish", "that body is perfect", "cant look away", "god tier stripper", "soaking wet watching", "touching myself hard", "need you naked", "im obsessed", "fuck that tease", "youre driving me crazy", "best show tonight", "take it off slow", "im gonna explode", "such a good tease", "youre so sexy", "loving every second" ], tier2: [ // 85-94 "so fucking hot", "god i wish i was there", "youre amazing", "fuck keep going", "im so turned on", "damn thats hot", "really good strip", "love watching this", "youre doing great", "god damn that reveal", "perfect tease", "i need more of this", "incredible tease", "so sexy baby", "cant get enough", "youre so skilled at this", "this is hot af", "love your body", "making me hard", "so beautiful", "youre perfect", "damn baby", "im getting close", "love the slow reveal", "so good rn", "youre a natural stripper", "fuck thats nice", "such a tease", "im here for this", "youre gorgeous", "love every curve", "so talented", "this is amazing", "youre killing it", "im hooked", "need more strips like this", "damn youre good", "loving every second", "youre so hot", "fuck yes baby", "great tease", "love the confidence", "youre stunning", "cant wait to see more" ], tier3: [ // 70-84 "nice strip", "looking good", "pretty hot", "keep going", "love it", "really good", "great moves", "not bad at all", "youre hot", "nice work", "great tease", "enjoying this", "looks great", "very nice strip", "good stuff", "keep it up", "doing well", "hot strip", "nice reveal", "pretty sexy", "good performance", "liking this", "solid strip", "looking sexy", "nice job", "decent strip", "enjoying the view", "not bad", "pretty good tease", "this is nice", "good work", "looks hot", "doing good", "nice body" ], tier4: [ // 50-69 "decent effort", "its alright", "could be better", "okay i guess", "not bad", "pretty good", "decent strip", "alright", "okay tease", "its fine", "not terrible", "average strip", "meh its okay", "decent", "could be hotter", "needs work but ok", "fine i guess", "eh alright" ], tier5: [ // 35-49 "bit awkward ngl", "maybe try again?", "youll get it", "keep practicing", "timing was off", "almost had it", "keep trying", "youll improve", "not quite there", "needs work", "bit rough", "try again", "almost", "needs improvement", "practice the tease more", "getting there", "awkward strip", "could be smoother", "keep working on it", "not your best" ], tier6: [ // <35 "lol wat", "u ok?", "that was bad lmao", "bruh...", "yikes", "wtf was that strip", "lmaooo", "bruh really?", "nah this aint it", "💀💀💀", "lol so awkward", "bruh that was ass", "💀", "cant even strip lmao", "yikes dude", "lmaooo wtf", "nah fam", "what even is that", "lmao nah", "so stiff", "bruh those moves 💀", "nah this cringe", "lol no", "awkward af", "oof", "this aint it chief", "💀💀", "yikes bro", "lmaoooo", "wtf was that" ] }, SIMULATE_SEX: { tier1: [ // 95+ "FUCK YES", "im gonna cum", "holy shit this is perfect", "best ive ever seen", "dont fucking stop", "omg that rhythm", "im cumming watching this", "so fucking hot", "god i wish that was me", "ride it baby", "fuck yes like that", "im so hard rn", "best simulation ever", "youre amazing at this", "fuck keep going", "im about to finish", "that looks so real", "god damn", "im stroking so hard", "cant handle this", "youre incredible", "im losing it", "so turned on rn", "dont stop baby", "fuck that toy", "perfect rhythm", "im edging hard", "need to see more", "god yes faster", "youre so good", "making me throb", "this is everything", "im gonna explode", "best ride ever", "holy fuck", "youre a pro", "soaking wet watching", "touching myself hard", "need you so bad", "im obsessed", "fuck me like that", "youre driving me wild", "best show tonight", "go deeper baby", "im cumming with you", "such good technique", "youre so sexy", "loving every thrust", "harder baby", "fuck yes that angle", "youre perfect", "im gonna lose it" ], tier2: [ // 85-94 "so fucking hot", "god that looks good", "youre amazing", "fuck keep riding", "im so turned on", "damn thats hot", "really good", "love watching this", "youre doing great", "god damn that motion", "perfect technique", "i need more", "incredible", "so sexy baby", "cant get enough", "youre so skilled", "this is hot af", "love your rhythm", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every movement", "so good rn", "youre a natural", "fuck thats nice", "great simulation", "im here for it", "youre gorgeous", "love your moves", "so talented", "this is amazing", "youre killing it", "im hooked", "need more of this", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great technique", "love the speed", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice rhythm", "looking good", "pretty hot", "keep going", "love it", "really good", "great moves", "not bad at all", "youre hot", "nice work", "great show", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot show", "nice technique", "pretty sexy", "good performance", "liking this", "solid show", "looking sexy", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice motion" ], tier4: [ // 50-69 "decent effort", "its alright", "could be better", "okay i guess", "not bad", "pretty good", "decent show", "alright", "okay", "its fine", "not terrible", "average show", "meh its okay", "decent", "could be hotter", "needs work but ok", "fine i guess", "eh alright" ], tier5: [ // 35-49 "bit awkward ngl", "maybe try again?", "youll get it", "keep practicing", "rhythm was off", "almost had it", "keep trying", "youll improve", "not quite there", "needs work", "bit rough", "try again", "almost", "needs improvement", "practice more", "getting there", "off rhythm", "could be smoother", "keep working on it", "not your best" ], tier6: [ // <35 "wtf was that", "lmaooo", "bruh really?", "nah this aint it", "💀💀💀", "lol so fake", "bruh that was ass", "💀", "cant even lmao", "yikes dude", "lmaooo wtf", "nah fam", "what even is that", "lmao nah", "so awkward", "bruh those moves 💀", "nah this cringe", "lol no", "looks fake af", "oof", "this aint it chief", "💀💀", "yikes bro", "lmaoooo", "wtf" ] }, BREASTS_CLAP: { tier1: [ // 95+ "FUCK those tits", "im so hard watching this", "best clapping ever", "holy shit yes", "dont stop baby", "omg that bounce", "im cumming", "so fucking hot", "god damn those tits", "perfect rhythm", "fuck yes", "im stroking to this", "best tits on here", "youre incredible", "cant stop watching", "im about to cum", "that bounce is perfect", "god yes", "im so hard rn", "this is amazing", "youre a goddess", "im losing it", "so turned on", "dont fucking stop", "clap those tits baby", "hypnotizing", "im edging hard", "need more", "god those are perfect", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best bounce ever", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need to see more", "im obsessed", "fuck i love your tits", "youre driving me crazy", "best show", "keep bouncing", "im cumming with you", "such perfect tits", "youre so sexy", "loving every clap", "bounce harder", "fuck yes that jiggle", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god damn those moves", "so fucking hot", "perfect rhythm", "i need more of this", "youre incredible", "damn thats hot", "really good clapping", "love watching", "youre doing great", "god damn that bounce", "perfect technique", "cant get enough", "this is hot af", "love your tits", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love the bounce", "so good rn", "youre a natural", "fuck thats nice", "great clapping", "im here for it", "youre gorgeous", "love the jiggle", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great rhythm", "love the speed", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice rhythm", "looking good", "pretty hot", "keep going", "love it", "really good", "great clapping", "not bad at all", "nice tits", "nice work", "great bounce", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice technique", "pretty sexy", "good show", "liking this", "solid clapping", "looking sexy", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice bounce" ], tier4: [ // 50-69 "decent effort", "its alright", "could be better", "okay i guess", "not bad", "pretty good", "decent clapping", "alright", "okay", "its fine", "not terrible", "average", "meh its okay", "decent", "could be hotter", "needs work but ok", "fine i guess", "eh alright" ], tier5: [ // 35-49 "timing was off", "almost had it", "keep trying", "youll get it", "rhythm off", "almost", "keep practicing", "youll improve", "not quite there", "needs work", "bit rough", "try again", "off timing", "needs improvement", "practice more", "getting there" ], tier6: [ // <35 "lol no rhythm", "bruh that was ass", "💀", "cant even clap lmao", "yikes dude", "lmaooo wtf", "bruh...", "that aint it", "💀💀", "nah fam", "lol what", "so awkward", "💀", "bruh really", "yikes", "cant even lol", "nah this aint it", "lmao nah", "awkward af", "oof" ] }, ASS_CLAP: { tier1: [ // 95+ "THAT ASS FUCK", "im gonna lose it", "best ass clapping ever", "holy shit yes", "dont stop please", "omg that ass", "im cumming", "so fucking hot", "god damn that ass", "perfect clapping", "fuck yes", "im stroking hard", "best ass on here", "youre incredible", "cant stop watching", "im about to cum", "that jiggle is perfect", "god yes", "im so hard rn", "this is amazing", "youre a goddess", "im losing it", "so turned on", "dont fucking stop", "clap that ass baby", "hypnotizing", "im edging hard", "need more", "god that ass is perfect", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best ass ever", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need to see more", "im obsessed", "fuck i love your ass", "youre driving me crazy", "best show", "keep clapping", "im cumming with you", "such a perfect ass", "youre so sexy", "loving every clap", "clap harder", "fuck yes that bounce", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god damn that ass", "so fucking hot", "perfect clapping", "i cant handle this", "youre amazing", "damn thats hot", "really good", "love watching", "youre doing great", "god damn that bounce", "perfect technique", "cant get enough", "this is hot af", "love your ass", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love the jiggle", "so good rn", "youre a natural", "fuck thats nice", "great clapping", "im here for it", "youre gorgeous", "love that ass", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great rhythm", "love the bounce", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice clapping", "great moves", "really hot", "keep it up", "love it", "really good", "great ass", "not bad at all", "nice", "nice work", "great bounce", "enjoying this", "looks great", "very nice", "good stuff", "keep going", "doing well", "hot", "nice technique", "pretty sexy", "good show", "liking this", "solid clapping", "looking sexy", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice jiggle" ], tier4: [ // 50-69 "decent show", "not bad", "its okay", "alright", "pretty good", "decent clapping", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "timing off", "almost there", "keep trying", "youll improve", "not quite", "almost", "needs work", "try again", "off rhythm", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lmaooo wtf", "bruh...", "that aint it", "💀💀", "nah fam", "lol what", "so awkward", "💀", "bruh really", "yikes", "cant even lol", "nah this aint it", "lmao nah", "awkward af", "oof" ] }, MASSAGE_BREASTS: { tier1: [ // 95+ "FUCK those circles", "so perfect", "im losing my mind", "best technique ever", "dont stop baby", "omg so smooth", "im cumming", "so fucking hot", "god those are perfect", "hypnotic movement", "fuck yes", "im stroking to this", "best massage ever", "youre incredible", "cant stop watching", "im about to cum", "so smooth baby", "god yes", "im so hard rn", "this is perfect", "youre a goddess", "im losing it", "so turned on", "dont fucking stop", "massage them baby", "hypnotizing", "im edging hard", "need more", "god your technique", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best hands ever", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need to see more", "im obsessed", "fuck i love watching", "youre driving me crazy", "best show", "keep going", "im cumming with you", "such perfect technique", "youre so sexy", "loving every second", "go slower baby", "fuck yes those circles", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god those are perfect", "so fucking hot", "i love watching this", "youre so good", "more please", "damn thats hot", "really smooth", "love watching", "youre doing great", "god damn that technique", "perfect circles", "cant get enough", "this is hot af", "love your hands", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love the motion", "so good rn", "youre a natural", "fuck thats nice", "great technique", "im here for it", "youre gorgeous", "love watching this", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great circles", "love the smoothness", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice technique", "pretty smooth", "looks good", "keep going", "hot", "really good", "great circles", "not bad", "nice", "nice work", "great movement", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid technique", "looking good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice motion" ], tier4: [ // 50-69 "decent effort", "not bad", "its alright", "okay", "pretty good", "decent", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "bit shaky", "almost there", "keep trying", "youll improve", "not quite", "almost", "needs work", "try again", "circles off", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "bruh those circles lol", "💀", "what even is that", "lmao nah", "yikes", "lol so shaky", "bruh...", "that aint it", "💀💀", "nah fam", "lol what", "so awkward", "cant even lol", "bruh really", "oof" ] }, MASTURBATE: { tier1: [ // 95+ "FUCK YES", "im cumming watching this", "so fucking hot", "best show ever", "dont stop baby please", "omg yes", "im cumming too", "this is perfect", "holy shit youre hot", "god i wish i was there", "fuck keep going", "im stroking hard", "best masturbation ever", "youre amazing", "cant stop watching", "im about to finish", "so turned on rn", "god yes", "im so hard rn", "this is everything", "youre incredible", "im losing it", "so fucking sexy", "dont fucking stop", "touch yourself baby", "so hot", "im edging hard", "need to see you cum", "god your technique", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best show tonight", "holy fuck", "youre perfect", "soaking wet watching", "touching with you", "need more", "im obsessed", "fuck i love this", "youre driving me crazy", "cum for me", "keep going baby", "im cumming with you", "so fucking hot", "youre so sexy", "loving every second", "faster baby", "fuck yes like that", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "holy shit youre hot", "god i wish i was there", "so turned on rn", "youre amazing", "fuck keep going", "damn thats hot", "really good", "love watching you", "youre doing great", "god damn", "perfect technique", "cant get enough", "this is hot af", "love watching this", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every move", "so good rn", "youre a natural", "fuck thats nice", "great show", "im here for it", "youre gorgeous", "love your body", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great technique", "love watching you", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "really hot", "loving this", "great show", "keep it up", "so good", "really good", "great moves", "not bad", "nice", "nice work", "hot show", "enjoying this", "looks great", "very nice", "good stuff", "keep going", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "looking good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice" ], tier4: [ // 50-69 "pretty good", "not bad", "decent show", "alright", "okay", "decent", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "seems forced", "try to relax", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "bit stiff", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lol fake af", "bruh really?", "💀💀💀", "nah this aint it", "yikes", "lol so fake", "bruh...", "that aint it", "💀💀", "nah fam", "looks fake", "so awkward", "cant even lol", "bruh really", "oof" ] }, SIMULATE_ORAL: { tier1: [ // 95+ "HOLY FUCK", "im so hard rn", "best technique ive seen", "god yes", "i need this so bad", "omg that looks good", "im cumming", "so fucking hot", "god i wish that was me", "perfect technique", "fuck yes", "im stroking hard", "best oral ever", "youre so skilled", "cant stop watching", "im about to finish", "that looks so real", "god yes", "im so hard", "this is perfect", "youre incredible", "im losing it", "so turned on", "dont fucking stop", "suck it baby", "so hot", "im edging hard", "need to see more", "god your mouth", "youre amazing", "making me throb", "cant handle this", "im gonna explode", "best bj simulation", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need you so bad", "im obsessed", "fuck that looks good", "youre driving me wild", "best show", "keep sucking baby", "im cumming with you", "such good technique", "youre so sexy", "loving every second", "deeper baby", "fuck yes like that", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "fuck that looks good", "youre so skilled", "i wish that was me", "so hot", "dont stop", "damn thats hot", "really good technique", "love watching", "youre doing great", "god damn", "perfect motion", "cant get enough", "this is hot af", "love your technique", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every movement", "so good rn", "youre a natural", "fuck thats nice", "great technique", "im here for it", "youre gorgeous", "love watching this", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great motion", "love the speed", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "really good", "nice technique", "pretty hot", "keep going", "love it", "really good", "great motion", "not bad", "nice", "nice work", "hot show", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "looking good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice" ], tier4: [ // 50-69 "decent work", "not bad", "its alright", "okay", "pretty good", "decent", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "bit awkward", "needs practice", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "off motion", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lmaooo bruh", "wtf was that", "💀", "nah fam", "yikes dude", "lol so fake", "bruh...", "that aint it", "💀💀", "nah", "looks fake af", "so awkward", "cant even lol", "bruh really", "oof" ] }, POSE_NUDE: { tier1: [ // 95+ "FUCK youre gorgeous", "perfect body", "im so turned on", "goddess", "i cant stop staring", "omg that body", "im cumming", "so fucking hot", "god youre beautiful", "perfect curves", "fuck yes", "im stroking hard", "best body on here", "youre stunning", "cant stop watching", "im about to cum", "so beautiful", "god yes", "im so hard rn", "this is perfect", "youre a goddess", "im losing it", "so turned on", "dont move", "pose for me baby", "so hot", "im edging hard", "need more poses", "god your body", "youre perfect", "making me throb", "cant handle this", "im gonna explode", "best pose ever", "holy fuck", "youre flawless", "soaking wet watching", "touching to you", "need to see more", "im obsessed", "fuck that body", "youre driving me crazy", "best view", "stay like that", "im cumming to you", "such a perfect body", "youre so sexy", "loving every curve", "turn around baby", "fuck yes that angle", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god youre beautiful", "so fucking hot", "amazing body", "youre perfect", "i need more", "damn thats hot", "really gorgeous", "love your body", "youre doing great", "god damn", "perfect figure", "cant get enough", "this is hot af", "love your curves", "making me hard", "so beautiful", "youre perfect", "damn baby", "im getting close", "love every angle", "so good rn", "youre stunning", "fuck thats nice", "great pose", "im here for it", "youre gorgeous", "love your body", "so hot", "this is amazing", "youre killing it", "im hooked", "need more poses", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great pose", "love the confidence", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "looking great", "really hot", "nice body", "beautiful", "keep it up", "really good", "great pose", "not bad", "nice", "nice work", "hot", "enjoying this", "looks great", "very nice", "good stuff", "keep posing", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "looking good", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice body" ], tier4: [ // 50-69 "pretty good", "not bad", "decent", "alright", "okay", "decent pose", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "bit stiff", "try to relax", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "awkward pose", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "bruh u look stiff af", "lol awkward", "💀💀", "nah man", "yikes", "lol so stiff", "bruh...", "that aint it", "💀💀", "nah fam", "looks awkward", "so stiff", "cant even lol", "bruh really", "oof" ] }, MOAN: { tier1: [ // 95+ "THOSE SOUNDS FUCK", "im cumming", "holy shit your voice", "best moans ever", "dont stop baby", "omg that voice", "im cumming to this", "so fucking hot", "god your moans", "perfect sounds", "fuck yes", "im stroking to this", "best moans on here", "youre incredible", "cant stop listening", "im about to finish", "so sexy", "god yes", "im so hard rn", "this is perfect", "youre amazing", "im losing it", "so turned on", "dont fucking stop", "moan for me baby", "so hot", "im edging hard", "need to hear more", "god your voice", "youre perfect", "making me throb", "cant handle this", "im gonna explode", "best sounds ever", "holy fuck", "youre perfect", "soaking wet listening", "touching to your moans", "need more", "im obsessed", "fuck those moans", "youre driving me wild", "best audio", "keep moaning baby", "im cumming with you", "such sexy sounds", "youre so hot", "loving every moan", "louder baby", "fuck yes like that", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god your moans", "so fucking sexy", "i love your voice", "youre amazing", "keep making those sounds", "damn thats hot", "really sexy", "love listening", "youre doing great", "god damn", "perfect sounds", "cant get enough", "this is hot af", "love your moans", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every sound", "so good rn", "youre a natural", "fuck thats nice", "great moans", "im here for it", "youre gorgeous", "love your voice", "so talented", "this is amazing", "youre killing it", "im hooked", "need more audio", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great sounds", "love the moaning", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice sounds", "really hot", "love your voice", "keep going", "great", "really good", "great moans", "not bad", "nice", "nice work", "hot sounds", "enjoying this", "sounds great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "sounding good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "sounds hot", "doing good", "nice voice" ], tier4: [ // 50-69 "not bad", "decent", "its alright", "okay", "pretty good", "decent moans", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "seems forced", "try to be natural", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "sounds fake", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lmaooo so fake", "bruh those sounds 💀", "nah this cringe", "yikes dude", "lol no", "lol so fake", "bruh...", "that aint it", "💀💀", "nah fam", "sounds fake af", "so cringe", "cant even lol", "bruh really", "oof" ] } }; // Generate prawn chat based on score and action type window.generatePrawnChat = function(score, actionType, viewers) { let messages = []; let messagePool; // Get action-specific messages let actionMessages = window.prawnChatMessages[actionType] || window.prawnChatMessages.STRIP_CLOTHING; // Determine message pool based on score if (score >= 95) { messagePool = actionMessages.tier1; } else if (score >= 85) { messagePool = actionMessages.tier2; } else if (score >= 70) { messagePool = actionMessages.tier3; } else if (score >= 50) { messagePool = actionMessages.tier4; } else if (score >= 35) { messagePool = actionMessages.tier5; } else { messagePool = actionMessages.tier6; } // Calculate number of messages based on viewers // Min 3 messages, max 15 at 1000+ viewers let minMessages = 3; let maxMessages = 15; let viewerCount = viewers || 0; // Scale messages: 3 at 0 viewers, 15 at 1000+ viewers let scaledMax = Math.min(maxMessages, minMessages + Math.floor((viewerCount / 1000) * (maxMessages - minMessages))); let numMessages = Math.floor(Math.random() * (scaledMax - minMessages + 1)) + minMessages; let usedIndices = new Set(); for (let i = 0; i < numMessages; i++) { let userIndex, msgIndex; // Get unique user do { userIndex = Math.floor(Math.random() * window.prawnChatUsers.length); } while (usedIndices.has(userIndex) && usedIndices.size < window.prawnChatUsers.length); usedIndices.add(userIndex); // Get random message msgIndex = Math.floor(Math.random() * messagePool.length); let user = window.prawnChatUsers[userIndex]; messages.push({ username: user.name, color: user.color, message: messagePool[msgIndex] }); } return messages; }; // Display chat with scrolling animation window.displayPrawnChat = function(containerId, messages) { let container = document.getElementById(containerId); if (!container) return; container.innerHTML = ''; container.style.opacity = '0'; let delay = 0; messages.forEach((msg, index) => { setTimeout(() => { let chatLine = document.createElement('div'); chatLine.className = 'prawn-chat-line'; chatLine.innerHTML = `<span class="prawn-chat-username" style="color: ${msg.color};">${msg.username}:</span> <span class="prawn-chat-message">${msg.message}</span>`; container.appendChild(chatLine); // Fade in container on first message if (index === 0) { container.style.opacity = '1'; } // Scroll to bottom container.scrollTop = container.scrollHeight; }, delay); delay += 150 + Math.random() * 200; // 150-350ms between messages }); }; <</script>>
<<nobr>> <<set $lastLocation = "PrawnHubAnalytics">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #ff1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">📊 PrawnHub Analytics Dashboard</h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Track your adult streaming performance and growth </p> </div> <!-- Overall Stats --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #ff1493; margin: 0 0 20px 0;">🎯 Channel Overview</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL FOLLOWERS</div> <div style="font-size: 32px; font-weight: bold; color: #e74c3c;"><<print ($prawnhubFollowers || 0).toLocaleString()>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL STREAMS</div> <div style="font-size: 32px; font-weight: bold; color: #3498db;"><<print ($prawnhubStreamHistory ? $prawnhubStreamHistory.length : 0)>></div> </div> <<if $prawnhubStreamHistory && $prawnhubStreamHistory.length > 0>> <<set _totalMinutes = 0>> <<set _totalIncome = 0>> <<for _i = 0; _i < $prawnhubStreamHistory.length; _i++>> <<set _totalMinutes += $prawnhubStreamHistory[_i].duration>> <<set _totalIncome += $prawnhubStreamHistory[_i].netEarnings>> <</for>> <<set _totalHours = Math.floor(_totalMinutes / 60)>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TIME STREAMED</div> <div style="font-size: 32px; font-weight: bold; color: #9b59b6;"><<print _totalMinutes>> min</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 32px; font-weight: bold; color: #f39c12;">$<<print _totalIncome.toFixed(2)>></div> </div> <</if>> </div> </div> <!-- Stream History --> <<if $prawnhubStreamHistory && $prawnhubStreamHistory.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 20px 0;">📅 Recent Stream History (Last 7)</h2> <<set _historyLength = $prawnhubStreamHistory.length>> <<set _startIdx = Math.max(0, _historyLength - 7)>> <<for _i = _historyLength - 1; _i >= _startIdx; _i-->> <<set _stream = $prawnhubStreamHistory[_i]>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; flex-wrap: wrap;"> <div> <strong style="color: #ff1493; font-size: 18px;">Day <<print _stream.day>></strong> <span style="color: #aaa; margin-left: 15px;"><<print _stream.duration>> minutes</span> </div> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; margin-bottom: 15px;"> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">NEW FOLLOWERS</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">+<<print _stream.newFollowers>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">PEAK VIEWERS</div> <div style="color: #3498db; font-size: 20px; font-weight: bold;"><<print _stream.viewers>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">AVG ENGAGEMENT</div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print Math.round(_stream.engagement)>>%</div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">NET EARNED</div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;">$<<print _stream.netEarnings.toFixed(2)>></div> </div> </div> <!-- Actions Performed --> <<if _stream.actionsPerformed && _stream.actionsPerformed.length > 0>> <div style="background: #0a0a0a; padding: 15px; border-radius: 6px;"> <div style="color: #ff69b4; font-size: 12px; margin-bottom: 8px; font-weight: bold;">ACTIONS PERFORMED:</div> <div style="display: flex; flex-wrap: wrap; gap: 5px;"> <<for _j = 0; _j < _stream.actionsPerformed.length; _j++>> <<set _actionName = _stream.actionsPerformed[_j].replace(/_/g, " ")>> <span style="background: #333; padding: 4px 8px; border-radius: 4px; font-size: 11px; color: #aaa; border: 1px solid #ff1493;"> <<print _actionName>> </span> <</for>> </div> </div> <</if>> </div> <</for>> </div> <!-- Last 7 Streams Statistics --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #e74c3c; margin: 0 0 20px 0;">📈 Last 7 Streams Statistics</h2> <<set _historyLength = $prawnhubStreamHistory.length>> <<set _statsStartIdx = Math.max(0, _historyLength - 7)>> <<set _last7TotalFollowers = 0>> <<set _last7TotalIncome = 0>> <<set _last7TotalMinutes = 0>> <<set _last7TotalViewers = 0>> <<set _last7TotalEngagement = 0>> <<set _last7Count = 0>> <<for _j = _statsStartIdx; _j < _historyLength; _j++>> <<set _last7TotalFollowers += $prawnhubStreamHistory[_j].newFollowers>> <<set _last7TotalIncome += $prawnhubStreamHistory[_j].netEarnings>> <<set _last7TotalMinutes += $prawnhubStreamHistory[_j].duration>> <<set _last7TotalViewers += $prawnhubStreamHistory[_j].viewers>> <<set _last7TotalEngagement += $prawnhubStreamHistory[_j].engagement>> <<set _last7Count++>> <</for>> <<set _avgViewers = Math.round(_last7TotalViewers / _last7Count)>> <<set _avgEngagement = Math.round(_last7TotalEngagement / _last7Count)>> <<set _avgIncomePerStream = Math.round((_last7TotalIncome / _last7Count) * 100) / 100>> <<set _avgFollowersPerStream = Math.round(_last7TotalFollowers / _last7Count)>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL NEW FOLLOWERS</div> <div style="font-size: 28px; font-weight: bold; color: #e74c3c;">+<<print _last7TotalFollowers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: <<print _avgFollowersPerStream>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 28px; font-weight: bold; color: #f39c12;">$<<print _last7TotalIncome.toFixed(2)>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: $<<print _avgIncomePerStream.toFixed(2)>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG PEAK VIEWERS</div> <div style="font-size: 28px; font-weight: bold; color: #3498db;"><<print _avgViewers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<print _last7Count>> streams</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG ENGAGEMENT</div> <div style="font-size: 28px; font-weight: bold; color: #9b59b6;"><<print _avgEngagement>>%</div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<print _last7Count>> streams</div> </div> </div> </div> <<else>> <!-- No Stream History --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 12px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center;"> <div style="font-size: 48px; margin-bottom: 20px;">📊</div> <h2 style="color: #aaa; margin: 0 0 15px 0;">No Stream Data Yet</h2> <p style="color: #888; font-size: 16px; margin: 0;"> Start streaming on PrawnHub to see your analytics and performance metrics here! </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff1493; margin: 0 0 15px 0;">🔞 PrawnHub System</h2> <!-- Follower Management --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 15px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">Follower Count</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff1493;">Current Followers:</strong> <span id="prawnFollowerCount" style="color: #ffd43b; font-size: 18px; font-weight: bold; margin-left: 10px;"><<print $prawnhubFollowers || 0>></span> </div> <!-- Increase Followers --> <div style="margin-bottom: 15px;"> <p style="color: #51cf66; margin: 0 0 10px 0; font-weight: bold;">⬆️ Increase Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+1</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 1>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+10</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 10>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+100</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 100>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+1,000</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 1000>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+10,000</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 10000>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+100,000</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 100000>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> </div> </div> <!-- Decrease Followers --> <div style="margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0 0 10px 0; font-weight: bold;">⬇️ Decrease Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-1</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 1)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-10</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 10)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-100</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 100)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-1,000</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 1000)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-10,000</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 10000)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-100,000</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 100000)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> </div> </div> <!-- Reset/Set Specific Amount --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 500 (Adult Streamer Job)</div>">> <<set $prawnhubFollowers = 500>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to 0</div>">> <<set $prawnhubFollowers = 0>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> </div> </div> <!-- Adult Toys --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 15px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🍆 Adult Toys</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<if $ownsDildo>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Dildo</div>">> <<set $ownsDildo = false>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Dildo</div>">> <<set $ownsDildo = true>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <</if>> <<if $ownsFleshlight>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Fleshlight</div>">> <<set $ownsFleshlight = false>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Fleshlight</div>">> <<set $ownsFleshlight = true>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <</if>> </div> </div> <!-- Job Management --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">💼 Adult Streamer Job</h3> <<if $jobs && $jobs.includes("Adult Streamer")>> <div style="background: #2a2a2a; padding: 12px; border-radius: 6px; margin-bottom: 10px; border: 1px solid #51cf66;"> <span style="color: #51cf66; font-weight: bold;">✓ Currently: Adult Streamer</span> <div style="color: #aaa; font-size: 13px; margin-top: 5px;">Platform cut: 30% (better revenue)</div> </div> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Adult Streamer Job</div>">> <<set $jobs = $jobs.filter(job => job !== "Adult Streamer")>> <<if $jobs.length === 0>><<set $jobs = ["Unemployed"]>><</if>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <<else>> <div style="background: #2a2a2a; padding: 12px; border-radius: 6px; margin-bottom: 10px; border: 1px solid #666;"> <span style="color: #aaa; font-weight: bold;">Current Job: <<if $jobs && $jobs.length > 0>><<print $jobs.join(", ")>><<else>>Unemployed<</if>></span> <div style="color: #ff6b6b; font-size: 13px; margin-top: 5px;">Platform cut: 70% (high fees)</div> </div> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Job to Adult Streamer</div>">> <<set $jobs = ["Adult Streamer"]>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <</if>> </div> </div> <</nobr>>
<<nobr>> <<silently>> <<if !$prawnhubRegistered>> <<set $prawnhubRegistered = false>> <</if>> <<if !$prawnhubFollowers>> <<set $prawnhubFollowers = 0>> <</if>> <<if !$prawnhubTotalEarnings>> <<set $prawnhubTotalEarnings = 0>> <</if>> <<if !$prawnhubSessionsToday>> <<set $prawnhubSessionsToday = 0>> <</if>> <<if !$prawnhubMaxSessions>> <<set $prawnhubMaxSessions = 3>> <</if>> <<if !$prawnhubStreamHistory>> <<set $prawnhubStreamHistory = []>> <</if>> <</silently>> <</nobr>> <<script>> window.savePrawnStream = function() { if (!State.variables.currentPrawnStream) return; var stream = State.variables.currentPrawnStream; // Calculate followers gained (current followers - starting followers) var followersGained = stream.followersGained || 0; if (stream.startingFollowers !== undefined) { followersGained = (State.variables.prawnhubFollowers || 0) - stream.startingFollowers; } var streamRecord = { day: State.variables.dayNumber || 1, viewers: stream.peakViewers || stream.viewers || 0, engagement: stream.currentEngagement || 0, earnings: stream.earnings || 0, netEarnings: stream.earnings || 0, newFollowers: followersGained, duration: stream.totalMinutes || 0, actionsPerformed: stream.actionsPerformed || [] }; State.variables.prawnhubStreamHistory.push(streamRecord); State.variables.prawnhubTotalEarnings += (stream.earnings || 0); State.variables.prawnhubSessionsToday++; State.variables.currentPrawnStream = null; }; <</script>>
<<silently>> <<set _options = [ {id: "Dock Worker", desc: "Start with the Dock Worker job and the Athletic Build trait."}, {id: "Barista", desc: "Start with the Barista job and the Energetic trait."}, {id: "Beauty Salon Stylist", desc: "Start with the Beauty Salon Stylist job and the Hair Styling trait."}, {id: "Curvy", desc: "Start with a Medium chest, Medium butt, and the Curvy physical trait."}, {id: "Starting Funds", desc: "Start with $1500."}, {id: "Quick Learner", desc: "Gain skills at the Bluefin Development Center faster."} ]>> <</silently>> <div style="display: grid; gap: 15px; margin: 0; padding: 0;"> <<for _opt range _options>><<capture _opt>><<set _isSelected = $startingOption === _opt.id>><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid <<if _isSelected>>#51cf66<<else>>#666<</if>>;"><div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"><strong style="color: <<if _isSelected>>#51cf66<<else>>#ccc<</if>>; font-size: 18px;"><<print _opt.id>></strong><<if _isSelected>><<link "<span style='color: #ff6b6b; font-weight: bold; font-size: 16px;'>REMOVE</span>">><<set $startingOption = null>><<replace "#starting-options-list">><<include "StartingOptionsDisplay">><</replace>><</link>><<else>><<link "<span style='color: #51cf66; font-weight: bold; font-size: 16px;'>SELECT</span>">><<set $startingOption = _opt.id>><<replace "#starting-options-list">><<include "StartingOptionsDisplay">><</replace>><</link>><</if>></div><p style="color: #aaa; margin: 0; font-style: italic; font-size: 15px;"><<print _opt.desc>></p></div><</capture>><</for>> </div>
/* ---------------------------------- */ /* --- TRAIT BONUSES SYSTEM (MUST BE FIRST) --- */ /* ---------------------------------- */ <<set setup.traitBonuses = { /* ================================== */ /* SPECIAL PHYSICAL TRAITS */ /* ================================== */ "Totally not a Vampire": {strength: 50, charisma: 50, dexterity: 50}, "Were-Creature": {strength: 60, dexterity: 60}, /* ================================== */ /* PHYSICAL TRAITS - POSITIVE */ /* ================================== */ "Artistic": {intelligence: 2, dexterity: 2}, "Athletic Build": {strength: 5, dexterity: 5}, "Attractive": {charisma: 8}, "Broad-shouldered": {strength: 4}, "Curvy": {charisma: 5}, "Customer-Focused": {charisma: 3, intelligence: 1}, "Dark Skin": {}, "Deep Thinker": {intelligence: 4}, "Detail-Oriented": {intelligence: 3, dexterity: 2}, "Fashionable": {charisma: 5}, "Fast": {dexterity: 6}, "Fit": {strength: 5, dexterity: 4}, "Flexible": {dexterity: 6}, "Freckled": {charisma: 2}, "Graceful": {dexterity: 6, charisma: 3}, "High Energy": {dexterity: 3, charisma: 4}, "Humorous": {charisma: 2}, "Lean": {dexterity: 4, strength: 2}, "Long Hair": {}, "Mature": {intelligence: 4, charisma: 2}, "Monotone Expression": {intelligence: 1}, "Muscular": {strength: 8}, "Pale Skin": {}, "Perceptive": {intelligence: 3, charisma: 1}, "Petite": {dexterity: 4}, "Pierced": {charisma: 2}, "Punctual": {intelligence: 1, charisma: 1}, "Quick": {dexterity: 5}, "Quick Reflexes": {dexterity: 6}, "Relaxed": {charisma: 2}, "Sarcastic": {charisma: 2, intelligence: 1}, "Sharp Features": {charisma: 4}, "Short Hair": {}, "Smooth Skin": {charisma: 3}, "Soft": {charisma: 3}, "Strong": {strength: 7}, "Sturdy": {strength: 4}, "Tall": {}, "Tan Skin": {}, "Tattooed": {charisma: 3}, "Tech Savvy": {intelligence: 5, dexterity: 2}, "Voluptuous": {charisma: 6}, "Youthful": {charisma: 3, dexterity: 2}, /* ================================== */ /* PHYSICAL TRAITS - MIXED */ /* ================================== */ "Scarred": {strength: 2, charisma: -3}, "Short": {}, /* ================================== */ /* PHYSICAL TRAITS - NEGATIVE */ /* ================================== */ "Blemished": {charisma: -4}, "Clumsy": {dexterity: -6}, "Overweight": {strength: -4, dexterity: -4, charisma: -3}, "Plain": {charisma: -3}, "Slow": {dexterity: -5, strength: -2}, "Stiff": {dexterity: -5}, "Ugly": {charisma: -8}, "Underweight": {strength: -5, charisma: -2}, "Weak": {strength: -7}, /* ================================== */ /* VOICE TRAITS - POSITIVE */ /* ================================== */ "Animated Tone": {charisma: 4}, "Articulate Speech": {charisma: 4, intelligence: 3}, "Balanced Neutral Tone": {}, "Bouncy Tone": {charisma: 3}, "Breathy Voice": {charisma: 2}, "Calm Voice": {charisma: 3}, "Charming Tone": {charisma: 5}, "Charismatic Voice": {charisma: 7}, "Clear Enunciation": {charisma: 3, intelligence: 2}, "Clear Pronunciation": {charisma: 3, intelligence: 2}, "Deep Voice": {charisma: 2}, "Eager Tone": {charisma: 3}, "Even-Paced Voice": {charisma: 2}, "Expressive Voice": {charisma: 5}, "Friendly Tone": {charisma: 4}, "Gentle Voice": {charisma: 3}, "Gravelly Voice": {charisma: 1}, "Hushed Intimate Voice": {charisma: 4}, "Lively Tone": {charisma: 4}, "Measured Speech": {intelligence: 3}, "Melodic Voice": {charisma: 5}, "Pleasant Cadence": {charisma: 4}, "Silky Voice": {charisma: 5}, "Sing-Songy Voice": {charisma: 3}, "Slow Calm Voice": {charisma: 2}, "Smooth Talker": {charisma: 6}, "Smooth Voice": {charisma: 4}, "Soft Monologue Style": {charisma: 2}, "Soft-Spoken": {charisma: 2}, "Soothing Tone": {charisma: 4}, "Steady Voice": {charisma: 3}, "Understated Voice": {charisma: 1}, "Warm Tone": {charisma: 5}, /* ================================== */ /* VOICE TRAITS - MIXED/NEGATIVE */ /* ================================== */ "Choppy Speech": {charisma: -2}, "Croaky Voice": {charisma: -2}, "Deadpan Delivery": {intelligence: 2, charisma: -2}, "Detached Voice": {charisma: -3}, "Emotionless Tone": {charisma: -4}, "Fast Talker": {dexterity: 2, charisma: -1}, "Flat Voice": {charisma: -2}, "Grim Tone": {charisma: -2}, "High-Pitched Tone": {charisma: -1}, "Interruptive Tone": {charisma: -3}, "Lazy Drawl": {charisma: -2}, "Monotone": {charisma: -3}, "Mumbly Voice": {charisma: -4}, "Nasally Tone": {charisma: -3}, "Rapid-Fire Speech": {dexterity: 3, charisma: -2}, "Raspy Voice": {}, "Robotic Tone": {intelligence: 2, charisma: -3}, "Shaky Voice": {charisma: -3}, "Sharp Voice": {charisma: -1}, "Snappy Tone": {charisma: -2}, "Stoic Tone": {intelligence: 2, charisma: -1}, "Stuttering Speech": {charisma: -3}, /* ================================== */ /* MENTAL TRAITS - POSITIVE */ /* ================================== */ "Alluring": {charisma: 7}, "Ambitious": {intelligence: 4, charisma: 3}, "Analytical": {intelligence: 5}, "Bookworm": {intelligence: 6}, "Brave": {strength: 4, charisma: 3}, "Calm": {intelligence: 2, charisma: 2}, "Charming": {charisma: 6}, "Chill": {charisma: 3, intelligence: 2}, "Competitive": {strength: 3, intelligence: 2}, "Confident": {charisma: 6}, "Considerate": {charisma: 5}, "Crafty": {intelligence: 4, dexterity: 3}, "Creative": {intelligence: 5}, "Curious": {intelligence: 3}, "Determined": {strength: 4, intelligence: 2}, "Diplomatic": {charisma: 5, intelligence: 3}, "Direct": {charisma: 2, intelligence: 1}, "Disciplined": {strength: 3, intelligence: 3}, "Efficient": {intelligence: 4, dexterity: 2}, "Empathetic": {charisma: 5, intelligence: 2}, "Energetic": {dexterity: 2, charisma: 2}, "Extroverted": {charisma: 5}, "Flirty": {charisma: 5}, "Focused": {intelligence: 4}, "Friendly": {charisma: 6}, "Funny": {charisma: 5}, "Hardworking": {strength: 3, intelligence: 3}, "High Stamina": {strength: 6, dexterity: 3}, "Humble": {charisma: 4}, "Intelligent": {intelligence: 5}, "Kind": {charisma: 6}, "Logical": {intelligence: 6}, "Loyal": {charisma: 4}, "Lucky": {charisma: 3, dexterity: 3}, "Negotiator": {charisma: 6, intelligence: 3}, "Nonchalant": {charisma: 2}, "Optimistic": {charisma: 4}, "Organized": {intelligence: 4}, "Outgoing": {charisma: 4}, "Patient": {intelligence: 3, charisma: 2}, "Polite": {charisma: 4}, "Reassuring": {charisma: 4}, "Resourceful": {intelligence: 5, dexterity: 2}, "Seductive": {charisma: 6}, "Shrewd": {intelligence: 5, charisma: 2}, "Sly": {intelligence: 4, charisma: 2}, "Steadfast": {strength: 3, intelligence: 2}, "Supportive": {charisma: 5}, "Talkative": {charisma: 3}, "Thoughtful": {intelligence: 3}, "Trusting": {charisma: 3}, "Warm": {charisma: 5}, "Wise": {intelligence: 7}, "Witty": {charisma: 3, intelligence: 2}, "Workaholic": {intelligence: 3, strength: 2}, /* ================================== */ /* MENTAL TRAITS - MIXED */ /* ================================== */ "Aggressive": {strength: 5, charisma: -2}, "Awkward": {charisma: -4}, "Bimbo": {intelligence: -50, charisma: 35}, "Blunt": {charisma: -2, intelligence: 2}, "Clingy": {charisma: -3}, "Corporate Drone": {intelligence: 2, charisma: -2}, "Corrupt": {charisma: 1}, "Cynical": {intelligence: 2, charisma: -3}, "Dominant": {charisma: 4, strength: 3}, "Honest": {charisma: 3, intelligence: -2}, "Impulsive": {dexterity: 3, intelligence: -3}, "Introverted": {intelligence: 3, charisma: -3}, "Moody": {charisma: -3}, "Overthinker": {intelligence: 3, charisma: -3}, "Paranoid": {intelligence: 2, charisma: -4}, "Passive": {charisma: -2, intelligence: 3}, "Perfectionist": {intelligence: 4, charisma: -2}, "Perverted": {}, "Pessimistic": {intelligence: 3, charisma: -3}, "Quiet": {charisma: -2, intelligence: 2}, "Risk Taker": {strength: 3, intelligence: -2}, "Sensitive": {charisma: -2, intelligence: 2}, "Shy": {charisma: -5, intelligence: 2}, "Stubborn": {strength: 4, intelligence: -2}, "Submissive": {charisma: -3, dexterity: 2}, "Tease": {charisma: 2}, "Tone Deaf": {charisma: -3}, "Unpredictable": {charisma: -2}, "Musky": {}, /* ================================== */ /* MENTAL TRAITS - NEGATIVE */ /* ================================== */ "Arrogant": {charisma: -6, intelligence: -2}, "Bitchy": {charisma: -5, intelligence: -2}, "Cold": {charisma: -5}, "Complacent": {intelligence: -4, strength: -3}, "Cowardly": {strength: -5, charisma: -4}, "Cruel": {charisma: -8, intelligence: -2}, "Deceitful": {charisma: -5, intelligence: -2}, "Disorganized": {intelligence: -4, dexterity: -2}, "Dull": {intelligence: -6, charisma: -3}, "Erratic": {charisma: -4, intelligence: -3}, "Foolish": {intelligence: -7, charisma: -2}, "Forgetful": {intelligence: -5}, "Immature": {intelligence: -4, charisma: -3}, "Impatient": {intelligence: -3, charisma: -4}, "Insecure": {charisma: -5}, "Insensitive": {charisma: -5}, "Jealous": {charisma: -5, intelligence: -2}, "Lazy": {strength: -5, intelligence: -4}, "Obsessive": {intelligence: -3, charisma: -4}, "Reckless": {intelligence: -4, strength: -3}, "Rude": {charisma: -6}, "Selfish": {charisma: -6}, "Short Tempered": {charisma: -5, intelligence: -2}, "Slow Learner": {intelligence: -6}, "Unlucky": {charisma: -3, dexterity: -3}, "Unreliable": {charisma: -5, intelligence: -3}, "Unskilled": {dexterity: -5, intelligence: -3}, /* ================================== */ /* STEREOTYPE TRAITS */ /* ================================== */ "Diva": {charisma: 6, intelligence: -3}, "Femboy": {charisma: 4, dexterity: 3}, "Geek": {intelligence: 5, charisma: -1}, "Goth": {charisma: 2, intelligence: 2}, "Jock": {strength: 5, dexterity: 4, intelligence: -2}, "Nerd": {intelligence: 6, charisma: -2}, "Prep": {charisma: 5, intelligence: 2}, "Tomboy": {strength: 3, dexterity: 3, charisma: -2} }>> <<set setup.skillBonuses = { /* ================================== */ /* SPECIAL SKILLS */ /* ================================== */ "BtestBraitBeesBigBeenore": {charisma: 90, dexterity: 90, strength: 90, intelligence: 90}, "Occult Expert": {intelligence: 30}, "Sunfish": {charisma: 50, dexterity: 50, strength: 50, intelligence: 50}, /* ================================== */ /* REGULAR SKILLS */ /* ================================== */ "Accounting": {intelligence: 6}, "Acting": {charisma: 6, intelligence: 2}, "Art": {dexterity: 4, intelligence: 3}, "Athletics": {strength: 5, dexterity: 4}, "Baking": {dexterity: 4, intelligence: 2}, "Cleaning": {dexterity: 3}, "Coding": {intelligence: 6}, "Combat": {strength: 6, dexterity: 3}, "Construction": {strength: 5, intelligence: 2}, "Cooking": {intelligence: 3, dexterity: 2}, "Customer Service": {charisma: 3, intelligence: 1}, "Dancing": {dexterity: 5, charisma: 3}, "Driving": {dexterity: 4}, "First Aid": {intelligence: 4}, "Foreign Language": {intelligence: 5}, "Forklift Certified": {dexterity: 3, strength: 2}, "Gardening": {intelligence: 2, strength: 2}, "Guitar": {dexterity: 4, charisma: 2}, "Hair Styling": {dexterity: 5, charisma: 2}, "Heavy Lifting": {strength: 7}, "High Heels Proficient": {dexterity: 4, charisma: 2}, "Inventory Management": {intelligence: 3, dexterity: 1}, "Languages": {intelligence: 5}, "Legal Knowledge": {intelligence: 7}, "Lock Picking": {dexterity: 6, intelligence: 2}, "Maid": {dexterity: 4}, "Makeup": {dexterity: 3, charisma: 3}, "Management": {intelligence: 5, charisma: 4}, "Martial Arts": {strength: 5, dexterity: 5}, "Math Skills": {intelligence: 5}, "Medicine": {intelligence: 7}, "Modeling": {charisma: 6}, "Music": {dexterity: 3, charisma: 4}, "Painting": {dexterity: 4, intelligence: 3}, "Persuasion": {charisma: 7}, "Photography": {intelligence: 3, charisma: 2}, "Piano": {dexterity: 5, intelligence: 2}, "Plumbing": {strength: 3, intelligence: 2}, "Product Knowledge": {intelligence: 2, charisma: 1}, "Public Speaking": {charisma: 6, intelligence: 2}, "Quick Learner": {}, "Retail": {charisma: 3, intelligence: 2}, "Sales": {charisma: 6, intelligence: 2}, "Serving": {charisma: 4, dexterity: 2}, "Sexually Skilled": {charisma: 5, dexterity: 2}, "Singing": {charisma: 5}, "Social Media": {charisma: 5, intelligence: 2}, "Stealth": {dexterity: 6}, "Swimmer": {strength: 4, dexterity: 3}, "Swimming": {strength: 4, dexterity: 3}, "Teaching": {intelligence: 5, charisma: 3}, "Tech-Savvy": {intelligence: 3, dexterity: 1}, "Trading": {charisma: 4, intelligence: 3}, "Troubleshooting": {intelligence: 3, dexterity: 2}, "Writing": {intelligence: 5}, "Yoga": {dexterity: 5, intelligence: 2} }>> /* Function to calculate total stat bonuses from traits and skills */ <<set setup.calculateStatBonuses = function() { var v = State.variables; var bonuses = { charisma: 0, dexterity: 0, strength: 0, intelligence: 0 }; // Add bonuses from physical traits if (v.physicalTraits) { v.physicalTraits.forEach(function(trait) { var traitBonus = setup.traitBonuses[trait]; if (traitBonus) { for (var stat in traitBonus) { bonuses[stat] += traitBonus[stat]; } } }); } // Add bonuses from mental traits if (v.mentalTraits) { v.mentalTraits.forEach(function(trait) { var traitBonus = setup.traitBonuses[trait]; if (traitBonus) { for (var stat in traitBonus) { bonuses[stat] += traitBonus[stat]; } } }); } // Add bonuses from character creation trait if (v.characterCreationTrait && setup.traitBonuses[v.characterCreationTrait]) { var traitBonus = setup.traitBonuses[v.characterCreationTrait]; for (var stat in traitBonus) { bonuses[stat] += traitBonus[stat]; } } // Add bonuses from skills if (v.skills) { v.skills.forEach(function(skill) { var skillBonus = setup.skillBonuses[skill]; if (skillBonus) { for (var stat in skillBonus) { bonuses[stat] += skillBonus[stat]; } } }); } return bonuses; }>> /* Function to get total stat (base + bonuses) */ <<set setup.getTotalStat = function(statName) { var v = State.variables; var bonuses = setup.calculateStatBonuses(); var total = v.stats[statName] + bonuses[statName]; // Cap at max if (total > v.statMaxCaps[statName]) { total = v.statMaxCaps[statName]; } return total; }>> /* Function to apply trait bonus */ <<set setup.applyTraitBonus = function(traitName, character) { var bonuses = setup.traitBonuses[traitName] || setup.skillBonuses[traitName]; if (!bonuses) return; for (var stat in bonuses) { if (character.stats && character.stats[stat] !== undefined) { character.stats[stat] += bonuses[stat]; // Also increase max cap if it exists if (character.statMaxCaps && character.statMaxCaps[stat] !== undefined) { character.statMaxCaps[stat] += bonuses[stat]; } } } }>> /* Function to remove trait bonus */ <<set setup.removeTraitBonus = function(traitName, character) { var bonuses = setup.traitBonuses[traitName] || setup.skillBonuses[traitName]; if (!bonuses) return; for (var stat in bonuses) { if (character.stats && character.stats[stat] !== undefined) { character.stats[stat] -= bonuses[stat]; // Also decrease max cap if it exists if (character.statMaxCaps && character.statMaxCaps[stat] !== undefined) { character.statMaxCaps[stat] -= bonuses[stat]; } } } }>>
/* ---------------------------------- */ /* --- MUTUALLY EXCLUSIVE TRAITS --- */ /* ---------------------------------- */ <<set setup.exclusiveTraitGroups = { // Height traits "height": ["Tall", "Short"], // Hair length traits "hairLength": ["Short Hair", "Long Hair"], // Body type traits with chest/butt requirements "bodyType": ["Curvy", "Voluptuous", "Petite", "Slim", "Muscular", "Stocky", "Lean"], // Voice traits - only one voice trait allowed "voice": ["Smooth Voice", "Soft-Spoken", "Warm Tone", "Gentle Voice", "Soothing Tone", "Silky Voice", "Clear Enunciation", "Articulate Speech", "Smooth Talker", "Friendly Tone", "Charismatic Voice", "Steady Voice", "Pleasant Cadence", "Calm Voice", "Expressive Voice", "Animated Tone", "Lively Tone", "Charming Tone", "Hushed Intimate Voice", "Balanced Neutral Tone", "Sing-Songy Voice", "Eager Tone", "Bouncy Tone", "Melodic Voice", "Clear Pronunciation", "Even-Paced Voice", "Understated Voice", "Soft Monologue Style", "Fast Talker", "Rapid-Fire Speech", "Deep Voice", "High-Pitched Tone", "Raspy Voice", "Gravelly Voice", "Croaky Voice", "Breathy Voice", "Nasally Tone", "Stoic Tone", "Measured Speech", "Choppy Speech", "Interruptive Tone", "Sharp Voice", "Snappy Tone", "Flat Voice", "Monotone", "Deadpan Delivery", "Detached Voice", "Emotionless Tone", "Slow Calm Voice", "Lazy Drawl", "Mumbly Voice", "Stuttering Speech", "Grim Tone", "Robotic Tone", "Flat Uninterested Voice", "Whiny Voice", "Slurred Speech", "Shaky Voice"], // Personality opposites "dominance": ["Dominant", "Submissive"], "kindness": ["Bitchy", "Kind"], "confidence": ["Confident", "Shy"], "energy": ["Energetic", "Lazy"], "social": ["Introverted", "Extroverted"], "optimism": ["Optimistic", "Pessimistic"], "morality": ["Cruel", "Kind"], "arrogance": ["Arrogant", "Humble"], "paranoia": ["Paranoid", "Trusting"], "bravery": ["Brave", "Cowardly"], "maturity": ["Mature", "Immature"], "patience": ["Patient", "Impatient"], "wisdom": ["Wise", "Foolish"], "work": ["Hardworking", "Lazy"], "aggression": ["Aggressive", "Passive"], "attraction": ["Attractive", "Ugly"], "organization": ["Organized", "Disorganized"], "reliability": ["Reliable", "Unreliable"], "temperament": ["Calm", "Short Tempered", "Moody"], "sociability": ["Talkative", "Quiet"], "manners": ["Polite", "Rude"], "warmth": ["Warm", "Cold"], "sensitivity": ["Sensitive", "Insensitive"], "charm": ["Charming", "Awkward"], "honesty": ["Honest", "Deceitful"], "selflessness": ["Considerate", "Selfish"], "speed": ["Fast", "Slow", "Quick"], "learning": ["Quick Learner", "Slow Learner"], "luck": ["Lucky", "Unlucky"], "impulsiveness": ["Disciplined", "Impulsive", "Reckless"], "stability": ["Steadfast", "Erratic", "Unpredictable"], "security": ["Confident", "Insecure"], "stereotypes": ["Nerd", "Geek", "Jock", "Prep", "Tomboy", "Femboy", "Diva", "Goth"], // Gender-mismatch traits (auto-assigned, untradable) "genderMismatch": ["Cuntboy", "Futanari"] }>> <<set setup.bodyTypeRequirements = { "Curvy": { minChest: "medium", minButt: "medium" }, "Voluptuous": { minChest: "medium", minButt: "medium" }, "Petite": { maxChest: "medium", maxButt: "medium" }, "Slim": { maxChest: "small", maxButt: "small" } }>> <<set setup.chestSizeOrder = ["flat", "small", "medium", "large", "huge", "giant", "gigantic"]>> <<set setup.buttSizeOrder = ["flat", "small", "medium", "large", "huge", "giant", "gigantic"]>> /* Check if a trait is exclusive with any existing traits */ <<set setup.getConflictingTrait = function(newTrait, existingTraits) { for (var groupName in setup.exclusiveTraitGroups) { var group = setup.exclusiveTraitGroups[groupName]; // If the new trait is in this group if (group.includes(newTrait)) { // Check if any existing trait is also in this group for (var i = 0; i < existingTraits.length; i++) { if (group.includes(existingTraits[i]) && existingTraits[i] !== newTrait) { return existingTraits[i]; } } } } return null; }>> /* Check if body type is compatible with current chest/butt size */ <<set setup.isBodyTypeCompatible = function(bodyType, chest, butt) { var requirements = setup.bodyTypeRequirements[bodyType]; if (!requirements) return true; var chestIndex = setup.chestSizeOrder.indexOf(chest.toLowerCase()); var buttIndex = setup.buttSizeOrder.indexOf(butt.toLowerCase()); if (requirements.minChest) { var minChestIndex = setup.chestSizeOrder.indexOf(requirements.minChest); if (chestIndex < minChestIndex) return false; } if (requirements.maxChest) { var maxChestIndex = setup.chestSizeOrder.indexOf(requirements.maxChest); if (chestIndex > maxChestIndex) return false; } if (requirements.minButt) { var minButtIndex = setup.buttSizeOrder.indexOf(requirements.minButt); if (buttIndex < minButtIndex) return false; } if (requirements.maxButt) { var maxButtIndex = setup.buttSizeOrder.indexOf(requirements.maxButt); if (buttIndex > maxButtIndex) return false; } return true; }>> /* Auto-adjust body parts when body type trait is gained */ <<set setup.adjustBodyPartsForTrait = function(bodyType, isPlayer) { var requirements = setup.bodyTypeRequirements[bodyType]; if (!requirements) return; var v = State.variables; var target = isPlayer ? v : arguments[2]; // Third argument is NPC object if not player var chest = isPlayer ? v.bodyParts.chest : target.bodyParts.chest; var butt = isPlayer ? v.bodyParts.butt : target.bodyParts.butt; var chestIndex = setup.chestSizeOrder.indexOf(chest.toLowerCase()); var buttIndex = setup.buttSizeOrder.indexOf(butt.toLowerCase()); var changed = false; // Adjust chest if needed if (requirements.minChest) { var minChestIndex = setup.chestSizeOrder.indexOf(requirements.minChest); if (chestIndex < minChestIndex) { if (isPlayer) { v.bodyParts.chest = requirements.minChest; } else { target.bodyParts.chest = requirements.minChest; } changed = true; } } if (requirements.maxChest) { var maxChestIndex = setup.chestSizeOrder.indexOf(requirements.maxChest); if (chestIndex > maxChestIndex) { if (isPlayer) { v.bodyParts.chest = requirements.maxChest; } else { target.bodyParts.chest = requirements.maxChest; } changed = true; } } // Adjust butt if needed if (requirements.minButt) { var minButtIndex = setup.buttSizeOrder.indexOf(requirements.minButt); if (buttIndex < minButtIndex) { if (isPlayer) { v.bodyParts.butt = requirements.minButt; } else { target.bodyParts.butt = requirements.minButt; } changed = true; } } if (requirements.maxButt) { var maxButtIndex = setup.buttSizeOrder.indexOf(requirements.maxButt); if (buttIndex > maxButtIndex) { if (isPlayer) { v.bodyParts.butt = requirements.maxButt; } else { target.bodyParts.butt = requirements.maxButt; } changed = true; } } return changed; }>>
/* ---------------------------------- */ /* --- JOB STAT REQUIREMENTS (NO LONGER USED FOR TRADING) --- */ /* ---------------------------------- */ <<set setup.jobRequirements = { "Unemployed": {}, "Street Performer": {charisma: 10}, "Package Courier": {dexterity: 10}, "Construction Worker": {strength: 15}, "Dock Worker": {strength: 15}, "Security Guard": {strength: 15}, "Baker": {dexterity: 10}, "Maid": {dexterity: 10}, "Hooker": {charisma: 30}, "Stripper": {charisma: 35}, "Prostitute": {charisma: 30}, "Fitness Shop Clerk": {strength: 25}, "Ecentric Shop Worker": {charisma: 20}, "Tech Store Clerk": {intelligence: 20}, "Adult Store Clerk": {charisma: 20}, "Beauty Salon Stylist": {dexterity: 30}, "Brothel Worker": {charisma: 35}, "Model": {charisma: 35}, "Bouncer": {strength: 40}, "Clinic Assistant": {intelligence: 40}, "Data Analyst": {intelligence: 50}, "Negotiator": {charisma: 50}, "Enforcer": {strength: 50}, "Porn Star": {charisma: 50}, "Social Media Influencer": {charisma: 45}, "Black Market Dealer": {charisma: 45}, "Police Officer": {strength: 45}, "Brothel Owner": {charisma: 70}, "Mayor's Secretary": {intelligence: 65}, "City Mayor": {charisma: 80, intelligence: 60}, "Fitness Trainer": {strength: 70}, "Barista": {charisma: 10, dexterity: 10}, "Dancing Instructor": {strength: 45, dexterity: 50}, "Bus Driver": {strength: 15, dexterity: 20}, "Cocktail Waitress": {charisma: 35, dexterity: 20}, "Mysterious Book Shop owner": {charisma: 100, intelligence: 50}, "Streamer": {charisma: 5, intelligence: 5, dexterity: 5, strength: 5}, "Adult Streamer": {charisma: 20, dexterity: 15, strength: 5}, "Amateur Musician": {charisma:20, dexterity: 10} }>> <<set setup.meetsJobRequirements = function(stats, jobName) { var requirements = setup.jobRequirements[jobName]; if (!requirements) return true; for (var stat in requirements) { if (stats[stat] < requirements[stat]) { return false; } } return true; }>> <<set setup.canTradeJob = function(playerJob, npcJob) { // Jobs can always be traded regardless of stats return true; }>>
/* ---------------------------------- */ /* --- TRAIT VALUE FUNCTION --- */ /* ---------------------------------- */ <<set setup.getTraitValue = function(type, name, size) { // Special test trait - DON'T CHANGE if (name === "BtestBraitBeesBigBeenore") { return 999; } // Were-Creature - DON'T CHANGE if (name === "Were-Creature") { return 450; } // Special handling for jobs - value = total stat requirements if (type === "job") { if (name === "Unemployed") { return -5; } var jobReqs = setup.jobRequirements[name]; if (jobReqs) { var totalReqs = 0; for (var stat in jobReqs) { totalReqs += jobReqs[stat]; } return totalReqs; } return 15; // Default job value } // Body parts - DON'T CHANGE if (type === "bodyPart") { if (name === "chest" || name === "butt") { var sizeValues = { "flat masculine": 10, "flat": 10, "small": 20, "medium": 50, "large": 70, "huge": 100, "giant": 150, "gigantic": 300 // NEW SIZE VALUE }; return sizeValues[size.toLowerCase()] || 12; } // Genital values if (name === "genitals") { var genitalValues = { "small penis": 15, "penis": 25, "big penis": 40, "tight vagina": 15, "vagina": 25, "loose vagina": 40 }; return genitalValues[size.toLowerCase()] || 20; } // Other body parts (gender, skin, hair, age) if (name === "gender") return 20; if (name === "skinTone") return 10; if (name === "hairColor") return 8; if (name === "hairLength") return 8; if (name === "age") return 12; return 12; } // INDIVIDUAL TRAIT VALUES var traitValues = { /* ================================== */ /* SPECIAL TRAITS */ /* ================================== */ "Definitely not a Vampire": 500, "Sunfish": 500, "Totally not a Vampire": 450, /* ================================== */ /* CHARACTER CREATION TRAITS */ /* ================================== */ "Jock": 30, "Naturally Gifted": 30, "Pensive": 30, "Quick Learner": 30, "Silver-Tongued": 30, "Swift": 30, /* ================================== */ /* PHYSICAL TRAITS - POSITIVE */ /* ================================== */ "Artistic": 36, "Athletic Build": 70, "Attractive": 70, "Broad-shouldered": 35, "Curvy": 70, "Customer-Focused": 40, "Dark Skin": 10, "Deep Thinker": 50, "Detail-Oriented": 35, "Fashionable": 40, "Fast": 35, "Fit": 70, "Flexible": 50, "Freckled": 20, "Graceful": 55, "High Energy": 35, "Humorous": 20, "Lean": 45, "Long Hair": 10, "Mature": 35, "Monotone Expression": 10, "Muscular": 95, "Pale Skin": 10, "Perceptive": 40, "Petite": 30, "Pierced": 15, "Punctual": 20, "Quick": 55, "Quick Reflexes": 35, "Relaxed": 25, "Sarcastic": 15, "Sharp Features": 35, "Short Hair": 5, "Smooth Skin": 50, "Soft": 30, "Strong": 55, "Sturdy": 25, "Tall": 35, "Tan Skin": 10, "Tattooed": 15, "Tech Savvy": 32, "Voluptuous": 105, "Youthful": 69, /* ================================== */ /* PHYSICAL TRAITS - MIXED */ /* ================================== */ "Scarred": 5, "Short": 10, /* ================================== */ /* PHYSICAL TRAITS - NEGATIVE */ /* ================================== */ "Blemished": -20, "Clumsy": -30, "Overweight": -30, "Plain": -15, "Slow": -28, "Stiff": -25, "Ugly": -40, "Underweight": -28, "Weak": -35, /* ================================== */ /* VOICE TRAITS - POSITIVE */ /* ================================== */ "Animated Tone": 25, "Articulate Speech": 32, "Balanced Neutral Tone": 10, "Bouncy Tone": 20, "Breathy Voice": 15, "Calm Voice": 20, "Charming Tone": 28, "Charismatic Voice": 38, "Clear Enunciation": 28, "Clear Pronunciation": 28, "Deep Voice": 15, "Eager Tone": 20, "Even-Paced Voice": 18, "Expressive Voice": 28, "Friendly Tone": 25, "Gentle Voice": 20, "Gravelly Voice": 12, "Hushed Intimate Voice": 25, "Lively Tone": 25, "Measured Speech": 18, "Melodic Voice": 28, "Pleasant Cadence": 25, "Silky Voice": 50, "Sing-Songy Voice": 20, "Slow Calm Voice": 15, "Smooth Talker": 35, "Smooth Voice": 39, "Soft Monologue Style": 18, "Soft-Spoken": 18, "Soothing Tone": 25, "Steady Voice": 20, "Understated Voice": 12, "Warm Tone": 28, /* ================================== */ /* VOICE TRAITS - MIXED/NEGATIVE */ /* ================================== */ "Choppy Speech": -5, "Croaky Voice": 5, "Deadpan Delivery": 5, "Detached Voice": -8, "Emotionless Tone": -10, "Fast Talker": 8, "Flat Voice": -5, "Grim Tone": -5, "High-Pitched Tone": 5, "Interruptive Tone": -8, "Lazy Drawl": -5, "Monotone": -8, "Mumbly Voice": -10, "Nasally Tone": -8, "Rapid-Fire Speech": 10, "Raspy Voice": 10, "Robotic Tone": -5, "Shaky Voice": -8, "Sharp Voice": 5, "Snappy Tone": -5, "Stoic Tone": 8, "Stuttering Speech": -8, /* ================================== */ /* MENTAL TRAITS - POSITIVE */ /* ================================== */ "Alluring": 90, "Ambitious": 32, "Analytical": 28, "Bookworm": 30, "Brave": 32, "Calm": 25, "Charming": 45, "Chill": 28, "Competitive": 28, "Confident": 35, "Considerate": 28, "Crafty": 30, "Creative": 28, "Curious": 20, "Determined": 60, "Diplomatic": 45, "Direct": 10, "Disciplined": 32, "Efficient": 60, "Empathetic": 32, "Energetic": 25, "Extroverted": 28, "Flirty": 30, "Focused": 25, "Friendly": 35, "Funny": 28, "Hardworking": 32, "High Stamina": 90, "Humble": 25, "Intelligent": 28, "Kind": 35, "Logical": 35, "Loyal": 30, "Lucky": 100, "Negotiator": 40, "Nonchalant": 18, "Optimistic": 25, "Organized": 25, "Outgoing": 25, "Patient": 28, "Polite": 25, "Reassuring": 25, "Resourceful": 32, "Seductive": 95, "Shrewd": 32, "Sly": 30, "Steadfast": 28, "Supportive": 28, "Talkative": 20, "Thoughtful": 20, "Trusting": 20, "Warm": 30, "Wise": 40, "Witty": 28, "Workaholic": 30, /* ================================== */ /* MENTAL TRAITS - MIXED */ /* ================================== */ "Aggressive": 18, "Awkward": -10, "Blunt": 10, "Clingy": -8, "Corporate Drone": 5, "Cynical": -5, "Dominant": 32, "Honest": 12, "Impulsive": 5, "Introverted": 8, "Moody": -8, "Overthinker": 8, "Paranoid": -5, "Passive": 5, "Perfectionist": 15, "Perverted": 0, "Pessimistic": 5, "Quiet": 5, "Risk Taker": 8, "Sensitive": 5, "Shy": -10, "Stubborn": 15, "Submissive": 8, "Tease": 15, "Tone Deaf": -8, "Unpredictable": -5, /* ================================== */ /* MENTAL TRAITS - NEGATIVE */ /* ================================== */ "Arrogant": -35, "Bitchy": -30, "Cold": -25, "Complacent": -30, "Corrupt": -5, "Cowardly": -38, "Cruel": -45, "Deceitful": -28, "Disorganized": -22, "Dull": -38, "Erratic": -28, "Foolish": -40, "Forgetful": -25, "Immature": -28, "Impatient": -28, "Insecure": -25, "Insensitive": -25, "Jealous": -28, "Lazy": -38, "Obsessive": -28, "Reckless": -28, "Rude": -30, "Selfish": -30, "Short Tempered": -28, "Slow Learner": -30, "Unlucky": -28, "Unreliable": -32, "Unskilled": -32, /* ================================== */ /* STEREOTYPE TRAITS */ /* ================================== */ "Diva": 20, "Femboy": 32, "Geek": 23, "Goth": 35, "Nerd": 25, "Prep": 32, "Tomboy": 22, /* ================================== */ /* SKILLS - SPECIAL */ /* ================================== */ "Occult Expert": 60, /* ================================== */ /* SKILLS - REGULAR */ /* ================================== */ "Accounting": 35, "Acting": 38, "Art": 32, "Athletics": 40, "Baking": 30, "Cleaning": 20, "Coding": 35, "Combat": 40, "Construction": 32, "Cooking": 28, "Customer Service": 25, "Dancing": 38, "Driving": 25, "First Aid": 25, "Foreign Language": 28, "Forklift Certified": 28, "Gardening": 22, "Guitar": 30, "Hair Styling": 32, "Heavy Lifting": 38, "High Heels Proficient": 30, "Inventory Management": 22, "Languages": 28, "Legal Knowledge": 42, "Lock Picking": 38, "Maid": 25, "Makeup": 30, "Management": 42, "Martial Arts": 45, "Math Skills": 28, "Medicine": 42, "Modeling": 35, "Music": 32, "Painting": 32, "Persuasion": 38, "Photography": 28, "Piano": 32, "Plumbing": 28, "Product Knowledge": 18, "Public Speaking": 38, "Retail": 28, "Sales": 38, "Serving": 30, "Sexually Skilled": 32, "Singing": 28, "Social Media": 32, "Stealth": 35, "Swimmer": 32, "Swimming": 32, "Teaching": 38, "Tech-Savvy": 22, "Trading": 32, "Troubleshooting": 28, "Writing": 28, "Yoga": 32, /* ================================== */ /* MISCELLANEOUS */ /* ================================== */ "Cuntboy": 0, "Futanari": 0 }; // Return the defined value or default if (traitValues[name] !== undefined) { return traitValues[name]; } // Default values if not found if (type === "physical") return 15; if (type === "mental") return 15; if (type === "skill") return 25; return 10; }>>
/* ---------------------------------- */ /* --- NPC LOOKUP FUNCTIONS --- */ /* ---------------------------------- */ <<set setup.getNPCsByJob = function(jobName) { var npcs = State.variables.npcs; var result = []; for (var i = 0; i < npcs.length; i++) { var npc = npcs[i]; // Handle unemployed specifically - NPCs with no jobs array or empty jobs array if (jobName === "Unemployed") { if (!npc.jobs || npc.jobs.length === 0) { result.push(npc); } } else { // Regular job matching - only include if they have this specific job if (npc.jobs && npc.jobs.length > 0 && npc.jobs.includes(jobName)) { result.push(npc); } } } return result; }>> <<set setup.getNPCByName = function(npcName) { var npcs = State.variables.npcs; for (var i = 0; i < npcs.length; i++) { if (npcs[i].name === npcName) { var npc = npcs[i]; // Ensure NPC has hair length (for backwards compatibility) if (!npc.appearance.hairLength) { npc.appearance.hairLength = Math.random() < 0.5 ? "short" : "long"; // Add corresponding physical trait var hairLengthTrait = npc.appearance.hairLength === "short" ? "Short Hair" : "Long Hair"; if (!npc.physicalTraits.includes(hairLengthTrait)) { npc.physicalTraits.push(hairLengthTrait); } } return npc; } } return null; }>> /* Compatibility function - always returns true since getNPCsAtLocation handles filtering */ <<set setup.isNPCAvailable = function(npcName) { return true; }>>
/* ---------------------------------- */ /* --- INITIALIZE CORE VARIABLES --- */ /* ---------------------------------- */ /* Initialize NPC array BEFORE loading data passages */ <<set $npcs = []>> <<set $metNPCs = []>> <<set $currentTradeNPC = null>> <<set $tradeHistory = []>> /* Function to calculate relationship bonus to trade chance */ <<set setup.getRelationshipTradeBonus = function(npcName) { var v = State.variables; if (!v.relationships[npcName]) return 0; var level = v.relationships[npcName].level; // Level 1 (Stranger) = 0%, each level after gives +3% if (level <= 1) return 0; return (level - 1) * 3; }>>
/* ---------------------------------- */ /* --- TRADE CHANCE CALCULATION --- */ /* ---------------------------------- */ <<set setup.calculatePreferenceValueAdjustment = function(npc, playerPackage, npcPackage, baseNpcValue) { var preferences = setup.getNPCPreferences(npc.name); if (!preferences) return baseNpcValue; var adjustedValue = 0; // Skills - check each skill's preference if (npcPackage.skills && npcPackage.skills.length > 0) { for (var i = 0; i < npcPackage.skills.length; i++) { var skill = npcPackage.skills[i]; var skillValue = setup.getTraitValue("skill", skill); var multiplier = 1.0; if (preferences.reluctantToTrade && preferences.reluctantToTrade.skills && preferences.reluctantToTrade.skills.includes(skill)) { multiplier = 1.3; // 30% extra cost } else if (preferences.willingToTrade && preferences.willingToTrade.skills && preferences.willingToTrade.skills.includes(skill)) { multiplier = 0.8; // 20% discount } adjustedValue += Math.ceil(skillValue * multiplier); } } // Mental traits - check each trait's preference if (npcPackage.mental && npcPackage.mental.length > 0) { for (var i = 0; i < npcPackage.mental.length; i++) { var trait = npcPackage.mental[i]; var traitValue = setup.getTraitValue("mental", trait); var multiplier = 1.0; if (preferences.reluctantToTrade && preferences.reluctantToTrade.mental && preferences.reluctantToTrade.mental.includes(trait)) { multiplier = 1.3; // 30% extra cost } else if (preferences.willingToTrade && preferences.willingToTrade.mental && preferences.willingToTrade.mental.includes(trait)) { multiplier = 0.8; // 20% discount } adjustedValue += Math.ceil(traitValue * multiplier); } } // Physical traits - check each trait's preference if (npcPackage.physical && npcPackage.physical.length > 0) { for (var i = 0; i < npcPackage.physical.length; i++) { var trait = npcPackage.physical[i]; var traitValue = setup.getTraitValue("physical", trait); var multiplier = 1.0; if (preferences.reluctantToTrade && preferences.reluctantToTrade.physical && preferences.reluctantToTrade.physical.includes(trait)) { multiplier = 1.3; // 30% extra cost } else if (preferences.willingToTrade && preferences.willingToTrade.physical && preferences.willingToTrade.physical.includes(trait)) { multiplier = 0.8; // 20% discount } adjustedValue += Math.ceil(traitValue * multiplier); } } // Body parts - check each body part's preference if (npcPackage.bodyParts && npcPackage.bodyParts.length > 0) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { var part = npcPackage.bodyParts[i]; // Get the actual value from the correct location var actualValue; if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { actualValue = npc.bodyParts[part.name]; } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "hairLength" || part.name === "age") { actualValue = npc.appearance[part.name]; } var partValue = setup.getTraitValue("bodyPart", part.name, actualValue); var multiplier = 1.0; if (preferences.reluctantToTrade && preferences.reluctantToTrade.bodyParts && preferences.reluctantToTrade.bodyParts.includes(part.name)) { multiplier = 1.3; // 30% extra cost } else if (preferences.willingToTrade && preferences.willingToTrade.bodyParts && preferences.willingToTrade.bodyParts.includes(part.name)) { multiplier = 0.8; // 20% discount } adjustedValue += Math.ceil(partValue * multiplier); } } // Job - check job preference if (npcPackage.job !== null && npcPackage.job !== undefined) { var jobValue = setup.getTraitValue("job", npcPackage.job || "Unemployed"); var multiplier = 1.0; if (preferences.reluctantToTrade && preferences.reluctantToTrade.job) { multiplier = 1.3; // 30% extra cost } else if (preferences.willingToTrade && preferences.willingToTrade.job) { multiplier = 0.8; // 20% discount } adjustedValue += Math.ceil(jobValue * multiplier); } // Name parts - no preference modifiers, just add base value if (npcPackage.name && npcPackage.name.length > 0) { adjustedValue += npcPackage.name.length * 5; } // Stats - no preference modifiers, just add base value if (npcPackage.stats && npcPackage.stats.length > 0) { for (var i = 0; i < npcPackage.stats.length; i++) { adjustedValue += npcPackage.stats[i].amount; } } return Math.max(1, adjustedValue); }>> <<set setup.calculateTradeChance = function(playerValue, npcValue, npc, playerPackage, npcPackage) { if (npcValue === 0) return 100; var v = State.variables; var ratio = playerValue / npcValue; var chance; // Need at least equal value for any chance if (playerValue < npcValue) { return 0; } // Equal value = 1% base chance if (ratio === 1.0) { chance = 1; } // 1.7x or more = 100% chance else if (ratio >= 1.7) { chance = 100; } // Calculate chance between 1% and 100% based on ratio else { // At 1.0x = 1%, at 1.7x = 100% // Range is 0.7 (from 1.0 to 1.7), giving us 99% spread (from 1% to 100%) var normalizedRatio = (ratio - 1.0) / 0.7; // Normalize to 0-1 range chance = 1 + (normalizedRatio * 99); // Map to 1-100% range chance = Math.round(chance); } // Apply charisma bonus: Logarithmic scaling // 8% at 100 charisma, 20% at 999 charisma var totalCharisma = setup.getTotalStat("charisma"); var charismaBonus = 0; if (totalCharisma > 0) { // Use logarithmic formula adjusted for desired scaling // At charisma = 100: should give ~8% // At charisma = 999: should give ~20% // Formula: baseValue * log(charisma) / log(targetCharisma) // Adjusted: 8.67 * log(charisma + 1) / log(101) gives ~8% at 100 // Then scale up to 20% at 999 var logValue = Math.log(totalCharisma + 1) / Math.log(101); charismaBonus = Math.floor(8.67 * logValue); // Additional scaling for higher values if (totalCharisma > 100) { var highBonus = ((totalCharisma - 100) / 899) * (20 - 8); charismaBonus = Math.floor(8 + highBonus); } charismaBonus = Math.max(0, Math.min(20, charismaBonus)); // Cap between 0-20% } chance += charismaBonus; // Apply Trading skill bonus: +2% if (v.skills.includes("Trading")) { chance += 2; } // Apply Bitchy trait penalty: -5% if (v.mentalTraits.includes("Bitchy")) { chance -= 5; } // Apply Persuasion skill bonus: +3% if (v.skills.includes("Persuasion")) { chance += 3; } // Apply NPC preference modifier var preferenceModifier = setup.calculatePreferenceModifier(npc, playerPackage, npcPackage); chance += preferenceModifier; // Apply relationship bonus var relationshipBonus = setup.getRelationshipTradeBonus(npc.name); chance += relationshipBonus; // Clamp between 0 and 100 return Math.max(0, Math.min(100, Math.round(chance))); }>>
/* ---------------------------------- */ /* --- NPC MEETING & RELATIONSHIP UPDATE --- */ /* ---------------------------------- */ <<set setup.meetNPC = function(npc) { var v = State.variables; var npcName = typeof npc === 'string' ? npc : npc.name; // Check if already met if (v.metNPCs.includes(npcName)) { return; // Already met, do nothing } // Add to met NPCs v.metNPCs.push(npcName); // Initialize relationship if it doesn't exist if (!v.relationships[npcName]) { v.relationships[npcName] = { level: 1, points: 0 }; } }>> <<set setup.addRelationshipPoints = function(npcName, points) { var v = State.variables; // Initialize relationship if it doesn't exist if (!v.relationships[npcName]) { v.relationships[npcName] = { level: 1, points: 0 }; } // Add points (can be negative) v.relationships[npcName].points += points; // Prevent negative points if (v.relationships[npcName].points < 0) { v.relationships[npcName].points = 0; } // Define points needed for each level (cumulative totals) // Level 1->2: 25 points total // Level 2->3: 25+50 = 75 points total // Level 3->4: 75+100 = 175 points total // Level 4->5: 175+250 = 425 points total var levelThresholds = [0, 25, 75, 175, 425]; // Calculate new level based on points var newLevel = 1; for (var i = levelThresholds.length - 1; i >= 0; i--) { if (v.relationships[npcName].points >= levelThresholds[i]) { newLevel = i + 1; break; } } v.relationships[npcName].level = newLevel; // Return the updated relationship for verification return v.relationships[npcName]; }>> <<set setup.updateNPCRelationshipKey = function(oldName, newName) { var v = State.variables; // Update metNPCs array var metIndex = v.metNPCs.indexOf(oldName); if (metIndex !== -1) { v.metNPCs[metIndex] = newName; } // Transfer relationship data to new name if (v.relationships[oldName]) { v.relationships[newName] = v.relationships[oldName]; delete v.relationships[oldName]; } }>> <<set setup.updateRelationshipFromTrade = function(npc, playerPackage, npcPackage, tradeSucceeded) { var v = State.variables; var npcName = npc.name; // Ensure relationship exists if (!v.relationships[npcName]) { v.relationships[npcName] = { level: 1, points: 0 }; } var prefs = setup.getNPCPreferences(npcName); if (!prefs) return; // No preferences set var pointsChange = 0; // Check what player OFFERED (things NPC receives) // DESIRES - NPC wants these (+2 points per desired item) if (prefs.desires) { if (prefs.desires.skills) { playerPackage.skills.forEach(function(skill) { if (prefs.desires.skills.includes(skill)) { pointsChange += 2; } }); } if (prefs.desires.mental) { playerPackage.mental.forEach(function(trait) { if (prefs.desires.mental.includes(trait)) { pointsChange += 2; } }); } if (prefs.desires.physical) { playerPackage.physical.forEach(function(trait) { if (prefs.desires.physical.includes(trait)) { pointsChange += 2; } }); } if (prefs.desires.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (prefs.desires.bodyParts.includes(part.name)) { pointsChange += 2; } }); } } // Check what player TOOK from NPC (things NPC loses) // RELUCTANT - NPC doesn't want to give these (-1 point per reluctant item) if (prefs.reluctantToTrade && tradeSucceeded) { if (prefs.reluctantToTrade.skills) { npcPackage.skills.forEach(function(skill) { if (prefs.reluctantToTrade.skills.includes(skill)) { pointsChange -= 1; } }); } if (prefs.reluctantToTrade.mental) { npcPackage.mental.forEach(function(trait) { if (prefs.reluctantToTrade.mental.includes(trait)) { pointsChange -= 1; } }); } if (prefs.reluctantToTrade.physical) { npcPackage.physical.forEach(function(trait) { if (prefs.reluctantToTrade.physical.includes(trait)) { pointsChange -= 1; } }); } if (prefs.reluctantToTrade.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (prefs.reluctantToTrade.bodyParts.includes(part.name)) { pointsChange -= 1; } }); } } // Apply points change if (pointsChange !== 0) { setup.addRelationshipPoints(npcName, pointsChange); } }>> <<set setup.calculateTradeValue = function(tradePackage, isPlayer) { var v = State.variables; var totalValue = 0; // Calculate value from skills if (tradePackage.skills && tradePackage.skills.length > 0) { for (var i = 0; i < tradePackage.skills.length; i++) { totalValue += setup.getTraitValue("skill", tradePackage.skills[i]); } } // Calculate value from mental traits if (tradePackage.mental && tradePackage.mental.length > 0) { for (var i = 0; i < tradePackage.mental.length; i++) { totalValue += setup.getTraitValue("mental", tradePackage.mental[i]); } } // Calculate value from physical traits if (tradePackage.physical && tradePackage.physical.length > 0) { for (var i = 0; i < tradePackage.physical.length; i++) { totalValue += setup.getTraitValue("physical", tradePackage.physical[i]); } } // Calculate value from body parts if (tradePackage.bodyParts && tradePackage.bodyParts.length > 0) { for (var i = 0; i < tradePackage.bodyParts.length; i++) { var part = tradePackage.bodyParts[i]; var actualValue; // Get the actual value from the correct location if (isPlayer) { if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { actualValue = v.bodyParts[part.name]; } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "hairLength" || part.name === "age") { actualValue = v.appearance[part.name]; } } else { // For NPC, need to get from tradingWithNPC var npc = v.tradingWithNPC; if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { actualValue = npc.bodyParts[part.name]; } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "hairLength" || part.name === "age") { actualValue = npc.appearance[part.name]; } } if (actualValue && actualValue !== "") { var partValue = setup.getTraitValue("bodyPart", part.name, actualValue); totalValue += partValue; } } } // Calculate value from job if (tradePackage.job !== null && tradePackage.job !== undefined) { totalValue += setup.getTraitValue("job", tradePackage.job); } // Calculate value from name parts if (tradePackage.name && tradePackage.name.length > 0) { totalValue += tradePackage.name.length * 5; // 5 points per name part } // Calculate value from stats if (tradePackage.stats && tradePackage.stats.length > 0) { for (var i = 0; i < tradePackage.stats.length; i++) { totalValue += tradePackage.stats[i].amount; } } return Math.max(0, totalValue); }>>
/* ---------------------------------- */ /* --- NPC TRADING PREFERENCES --- */ /* ---------------------------------- */ <<set setup.npcTradingPreferences = { "Marcus Carter": { desires: { skills: ["Medicine", "Coding"], mental: ["Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Combat", "Athletics", "Public Speaking", "Acting"], mental: ["Confident", "Brave"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Guitar"], mental: ["Outgoing"], physical: ["Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Shy", "Cowardly"], physical: ["Weak", "Underweight", "Ugly"], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] } }, "Elena Romero": { desires: { skills: ["Languages", "Art"], mental: ["Creative", "Empathetic"], physical: ["Attractive"], bodyParts: [], chestSize: ["medium", "large"], buttSize: ["medium", "large"], genitals: [] }, willingToTrade: { skills: ["Coding", "Math Skills", "Painting"], mental: ["Analytical", "Shy"], physical: ["Graceful", "Youthful"], bodyParts: [], chestSize: ["small"], buttSize: ["small"], genitals: [], job: true }, reluctantToTrade: { skills: ["Medicine", "First Aid"], mental: ["Patient", "Kind", "Intelligent"], physical: ["Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cruel", "Aggressive", "Arrogant"], physical: ["Muscular", "Scarred", "Ugly"], bodyParts: [], chestSize: ["giant","flat masculine"], buttSize: ["giant","flat masculine"], genitals: [] } }, "Silva Silva": { desires: { skills: ["Management", "Accounting"], mental: ["Diplomatic", "Organized"], physical: ["Fashionable", "Attractive"], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Driving", "Athletics", "Languages"], mental: ["Ambitious"], physical: ["Quick", "Lean"], bodyParts: [], chestSize: ["medium"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Persuasion", "Public Speaking"], mental: ["Shrewd", "Confident"], physical: ["Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Disorganized", "Dull"], physical: ["Overweight", "Clumsy", "Plain"], bodyParts: [], chestSize: ["small", "flat"], buttSize: ["small", "flat"], genitals: [] } }, "Grimm Patel": { desires: { skills: ["Legal Knowledge"], mental: ["Calm", "Patient"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Cooking"], mental: ["Stubborn", "Cynical"], physical: ["Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Combat", "Stealth", "Persuasion"], mental: ["Dominant", "Shrewd"], physical: ["Muscular", "Strong"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Naive", "Trusting", "Submissive"], physical: ["Weak", "Youthful", "Soft"], bodyParts: [], chestSize: ["medium", "large", "huge", "giant"], buttSize: ["medium", "large", "huge", "giant"], genitals: [] } }, "Scarlett Vex": { desires: { skills: ["Management", "Business"], mental: ["Shrewd", "Diplomatic"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Photography", "Dancing"], mental: ["Ambitious", "Arrogant"], physical: ["Fit", "Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled", "Acting", "Modeling"], mental: ["Confident", "Outgoing"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Submissive"], physical: ["Ugly", "Plain", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jade Nightshade": { desires: { skills: ["Persuasion", "Social Media"], mental: ["Confident", "Alluring"], physical: ["Voluptuous"], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Singing", "Acting"], mental: ["Creative"], physical: ["Flexible", "Graceful"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Sexually Skilled"], mental: ["Sly"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Honest", "Naive", "Insecure"], physical: ["Plain", "Stiff", "Clumsy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Apollo Sterling": { desires: { skills: ["Acting", "Photography"], mental: ["Ambitious", "Charismatic"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Music", "Athletics"], mental: ["Creative"], physical: ["Flexible", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Modeling"], mental: ["Confident", "Outgoing"], physical: ["Muscular"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Awkward", "Insecure"], physical: ["Ugly", "Overweight", "Weak"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Diamond Murphy": { desires: { skills: ["Management", "Sales"], mental: ["Organized", "Diplomatic"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Baking", "Stealth"], mental: ["Stubborn", "Selfish"], physical: ["Tattooed"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled", "Persuasion"], mental: ["Sly", "Hardworking"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Naive", "Trusting", "Kind"], physical: ["Soft", "Youthful", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Tank Morrison": { desires: { skills: ["First Aid", "Driving"], mental: ["Patient", "Intelligent"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Cooking", "Athletics"], mental: [], physical: ["Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Combat", "Heavy Lifting"], mental: ["Brave", "Calm", "Honest", "Loyal"], physical: ["Muscular", "Tall", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Deceitful", "Selfish", "Cowardly"], physical: ["Weak", "Clumsy", "Frail"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Candace Luxe": { desires: { skills: ["Photography", "Art"], mental: ["Creative", "Sensitive"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Painting", "Dancing"], mental: ["Friendly", "Empathetic"], physical: ["Pierced", "Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Confident", "Warm"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cold", "Cruel", "Aggressive"], physical: ["Scarred", "Blemished", "Ugly"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Ruby Becker": { desires: { skills: ["Public Speaking", "Acting"], mental: ["Confident", "Outgoing"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Writing", "Photography"], mental: ["Creative", "Shy"], physical: ["Freckled", "Smooth Skin"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Kind", "Sensitive"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cruel", "Aggressive", "Arrogant"], physical: ["Scarred", "Ugly", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Sapphire Wallace": { desires: { skills: ["Management", "Business"], mental: ["Shrewd", "Organized"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Martial Arts", "Dancing"], mental: ["Ambitious", "Aggressive"], physical: ["Tattooed", "Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Dominant", "Confident"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Shy", "Weak"], physical: ["Soft", "Weak", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jasmine Abrams": { desires: { skills: ["Meditation", "Art"], mental: ["Calm", "Creative"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Yoga"], mental: ["Patient", "Submissive"], physical: ["Flexible", "Graceful", "Smooth Skin"], bodyParts: [], chestSize: ["medium"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled", "Dancing"], mental: ["Friendly", "Kind"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Scarred", "Ugly", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Ebony Vasquez": { desires: { skills: ["Management", "Public Speaking"], mental: ["Confident", "Ambitious"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Acting", "Singing"], mental: ["Competitive"], physical: ["Smooth Skin"], bodyParts: [], chestSize: ["large"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Sly", "Witty"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Dull"], physical: ["Ugly", "Plain", "Clumsy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Amber Skye": { desires: { skills: ["Photography", "Acting"], mental: ["Creative", "Ambitious"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Social Media", "Music"], mental: ["Curious", "Naive"], physical: ["Youthful", "Smooth Skin"], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Optimistic", "Energetic"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cynical", "Cruel", "Pessimistic"], physical: ["Scarred", "Ugly", "Mature"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Kate Velvet": { desires: { skills: ["Legal Knowledge", "Public Speaking"], mental: ["Intelligent", "Diplomatic"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Languages"], mental: ["Arrogant"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Management", "Persuasion", "Accounting", "Sexually Skilled"], mental: ["Dominant", "Shrewd", "Ambitious", "Confident"], physical: ["Attractive", "Mature", "Voluptuous", "Sharp Features"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: false }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Naive", "Foolish"], physical: ["Ugly", "Youthful", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Bella Carver": { desires: { skills: ["Management", "Business"], mental: ["Shrewd", "Organized"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Acting", "Makeup"], mental: ["Creative", "Naive"], physical: ["Youthful"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Social Media", "Photography"], mental: ["Outgoing", "Ambitious"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Introverted", "Cynical", "Mature"], physical: ["Ugly", "Mature", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jake Steel": { desires: { skills: ["Mechanical Repair"], mental: ["Patient", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Fishing", "Driving"], mental: ["Calm"], physical: ["Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Hardworking", "Honest", "Loyal"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Deceitful", "Lazy"], physical: ["Weak", "Clumsy", "Soft"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Marco Rodriguez": { desires: { skills: ["Dancing", "Music"], mental: ["Creative", "Outgoing"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Cooking", "Guitar"], mental: ["Friendly"], physical: ["Tattooed"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Competitive", "Brave"], physical: ["Muscular", "Strong", "Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Introverted", "Cold"], physical: ["Weak", "Stiff", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Tyrone Washington": { desires: { skills: ["Business", "Public Speaking"], mental: ["Ambitious", "Confident"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Basketball", "Music"], mental: [], physical: ["Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Outgoing", "Witty"], physical: ["Muscular", "Strong", "Sturdy", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Submissive"], physical: ["Short", "Weak", "Ugly"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Sheryl Williams": { desires: { skills: ["Management", "Leadership"], mental: ["Organized", "Diplomatic"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Gardening"], mental: ["Stubborn"], physical: ["Athletic Build"], bodyParts: [], chestSize: ["small"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction", "Martial Arts"], mental: ["Hardworking", "Brave"], physical: ["Muscular", "Strong", "Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Shy", "Weak"], physical: ["Soft", "Weak", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "David O'Brien": { desires: { skills: ["Art", "Music"], mental: ["Creative", "Calm"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Plumbing", "Painting"], mental: [], physical: ["Freckled"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Calm", "Patient", "Thoughtful"], physical: ["Muscular", "Strong", "Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Loud", "Arrogant"], physical: ["Weak", "Clumsy", "Ugly"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Mike Murphy": { desires: { skills: ["Combat Training"], mental: ["Disciplined", "Focused"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], desiredJob: "Brothel Worker" }, willingToTrade: { skills: ["Cooking", "Swimming"], mental: ["Aggressive", "Short Tempered"], physical: ["Tattooed"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Competitive", "Brave"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Calm", "Patient", "Submissive"], physical: ["Weak", "Soft", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Carlos Mendez": { desires: { skills: ["Cooking", "Performance"], mental: ["Creative", "Charming"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Dancing", "Guitar"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Friendly", "Outgoing", "Optimistic"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cold", "Cruel", "Pessimistic"], physical: ["Ugly", "Scarred", "Weak"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jamal Rivers": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Basketball", "Writing"], mental: [], physical: ["Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Intelligent", "Competitive"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Foolish", "Disorganized"], physical: ["Weak", "Overweight", "Clumsy"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Rosa Otterino": { desires: { skills: ["Art", "Photography"], mental: ["Creative", "Patient"], physical: [], bodyParts: [], chestSize: ["medium", "large"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Swimming", "Painting"], mental: [], physical: ["Athletic Build", "Tattooed"], bodyParts: [], chestSize: ["small"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Hardworking", "Honest", "Calm"], physical: ["Muscular", "Strong"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Deceitful", "Lazy"], physical: ["Weak", "Soft", "Clumsy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Keisha Jackson": { desires: { skills: ["Performance", "Music"], mental: ["Creative", "Outgoing"], physical: ["Attractive"], bodyParts: [], chestSize: ["large", "huge","flat masculine"], buttSize: ["huge", "giant","flat masculine"], genitals: [] }, willingToTrade: { skills: ["Singing", "Cooking"], mental: [], physical: ["Curvy"], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Confident", "Outgoing", "Brave"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Introverted", "Cold"], physical: ["Weak", "Plain", "Slim"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Dick Richardson": { desires: { skills: ["Business", "Finance"], mental: ["Shrewd", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: ["Arrogant", "Selfish"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Public Speaking", "Management", "Legal Knowledge"], mental: ["Shrewd", "Ambitious", "Dominant"], physical: ["Mature", "Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Honest", "Kind", "Submissive"], physical: ["Youthful", "Attractive", "Weak"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Creo Applesauce": { desires: { skills: ["Art", "Music"], mental: ["Creative", "Confident"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Piano", "Languages"], mental: ["Submissive", "Anxious"], physical: ["Lean"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Management", "Accounting", "Coding"], mental: ["Intelligent", "Analytical", "Patient"], physical: ["Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Dominant", "Arrogant"], physical: ["Muscular", "Scarred", "Ugly"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Brad Icus": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Gardening", "Cooking"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Athletics", "Sales", "Heavy Lifting"], mental: ["Energetic", "Friendly", "Optimistic"], physical: ["Fit", "Muscular", "Athletic Build", "Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Pessimistic", "Introverted"], physical: ["Weak", "Overweight", "Ugly"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Raven Bido": { desires: { skills: ["Music", "Performance"], mental: ["Confident", "Outgoing"], physical: [], bodyParts: [], chestSize: ["medium", "large","flat masculine"], buttSize: ["medium", "large","flat masculine"], genitals: [] }, willingToTrade: { skills: [], mental: ["Introverted", "Shy"], physical: ["Lean", "Youthful"], bodyParts: [], chestSize: ["small"], buttSize: ["small"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sales", "Art", "Painting", "Music", "Writing"], mental: ["Creative", "Curious"], physical: ["Tattooed", "Pierced"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Prep", "Optimistic"], physical: ["Plain", "Fashionable", "Smooth Skin"], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] } }, "Crystal Meffin": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Art", "Photography"], mental: [], physical: ["Youthful"], bodyParts: [], chestSize: ["medium"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Hair Styling", "Makeup"], mental: ["Friendly", "Outgoing", "Creative"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Introverted", "Cynical", "Rude"], physical: ["Ugly", "Clumsy", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Sophi Boris": { desires: { skills: ["Acting", "Performance"], mental: ["Creative", "Confident"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Social Media", "Singing"], mental: ["Arrogant"], physical: ["Curvy"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Hair Styling", "Makeup", "Dancing"], mental: ["Witty", "Ambitious"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Humble", "Submissive"], physical: ["Plain", "Ugly", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Naomi Light": { desires: { skills: ["Meditation", "Teaching"], mental: ["Calm", "Wise"], physical: [], bodyParts: [], chestSize: ["medium", "large","flat masculine"], buttSize: ["large", "huge","flat masculine"], genitals: [] }, willingToTrade: { skills: ["Yoga", "Gardening"], mental: [], physical: ["Flexible"], bodyParts: [], chestSize: ["small"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Hair Styling", "Makeup"], mental: ["Kind", "Patient", "Empathetic"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Scarred", "Ugly", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Kevin Oats": { desires: { skills: ["Social Skills", "Public Speaking"], mental: ["Confident", "Outgoing"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], desiredJob: "Brothel Worker" }, willingToTrade: { skills: ["Gaming"], mental: ["Shy", "Awkward", "Insecure"], physical: ["Lean", "Youthful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Coding", "Sales", "Math Skills"], mental: ["Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: ["flat masculine"], buttSize: ["flat masculine"], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Aggressive", "Dominant"], physical: ["Ugly", "Muscular", "Scarred"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Destiny Pumpkin": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Art", "Writing"], mental: ["Selfish"], physical: ["Tattooed", "Pierced"], bodyParts: [], chestSize: ["huge"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sales", "Persuasion", "Sexually Skilled"], mental: ["Confident", "Sly", "Creative"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Kind", "Honest", "Submissive"], physical: ["Plain", "Ugly", "Soft"], bodyParts: [], chestSize: ["flat", "small", "medium"], buttSize: ["flat", "small"], genitals: [] } }, "Alex Passionfruit": { desires: { skills: ["Art", "Photography"], mental: ["Creative", "Sensitive"], physical: [], bodyParts: ["huge"], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Music", "Gaming"], mental: [], physical: ["Lean", "Pierced"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Sales", "Persuasion", "Sexually Skilled"], mental: ["Outgoing", "Witty", "Curious"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Ugly", "Muscular", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Hannah Chuckins": { desires: { skills: ["Business", "Sales"], mental: ["Ambitious", "Confident"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Painting", "Singing"], mental: ["Shy"], physical: ["Freckled"], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Baking", "Cooking", "Gardening"], mental: ["Kind", "Patient", "Creative"], physical: ["Soft", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cruel", "Aggressive", "Arrogant"], physical: ["Ugly", "Scarred", "Athletic Build"], bodyParts: [], chestSize: ["flat", "small"], buttSize: ["flat", "small"], genitals: [] } }, "Pheiffer Coms": { desires: { skills: ["Medicine", "Investigation"], mental: ["Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Fishing"], mental: ["Stubborn"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Combat", "Driving", "First Aid", "Athletics"], mental: ["Brave", "Honest"], physical: ["Fit", "Strong", "Athletic Build", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Deceitful", "Cowardly", "Lazy"], physical: ["Weak", "Overweight", "Clumsy"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Fen Ris": { desires: { skills: ["Legal Knowledge", "Sexually Skilled"], mental: ["Calm", "Patient", "Honest"], physical: ["Curvy"], bodyParts: [], chestSize: ["giant"], buttSize: ["large", "huge", "giant"], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: ["huge"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Teaching", "Athletics", "Heavy Lifting", "Combat", "Yoga"], mental: ["Confident"], physical: ["Sharp Features", "Muscular", "Athletic Build", "Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: ["Calm", "Patient", "Honest"], physical: ["Were-Creature"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Deceitful", "Cowardly", "Cruel"], physical: ["Weak", "Ugly", "Blemished"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Selkira Onyxia": { desires: { skills: ["Public Speaking", "Social Media"], mental: ["Extroverted", "Patient", "Warm"], physical: ["Pale Skin"], bodyParts: [], chestSize: ["huge"], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Serving", "Acting", "Languages"], mental: ["Overthinker", "Impulsive", "Cold", "Jealous"], physical: ["Broad-shouldered"], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [], job: true }, reluctantToTrade: { skills: ["High Heels Proficient", "Sexually Skilled"], mental: ["Seductive", "Alluring"], physical: ["Silky Voice"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: ["Dominant"], physical: ["Curvy", "Flexible"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive"], physical: ["Ugly", "Overweight", "Blemished", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Janis Besser": { desires: { skills: ["Modeling", "Sexually Skilled"], mental: ["Competitive", "Creative", "Intelligent"], physical: ["Voluptuous"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [] }, willingToTrade: { skills: ["Gardening", "Painting"], mental: ["Shy", "Nurturing"], physical: ["Petite", "Soft", "Freckled", "Youthful"], bodyParts: [], chestSize: ["small"], buttSize: ["small"], genitals: [], job: true }, reluctantToTrade: { skills: ["Baking", "Cooking"], mental: ["Kind", "Patient", "Creative"], physical: ["Warm Tone", "Quick"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Muscular", "Tall", "Scarred", "Ugly"], bodyParts: [], chestSize: ["flat masculine", "giant"], buttSize: ["flat masculine", "giant"], genitals: [] } }, "Dennis Fungi": { desires: { skills: ["Music", "Performance", "Art"], mental: ["Creative", "Ambitious"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Yoga"], mental: ["Energetic"], physical: ["Flexible"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Teaching", "Athletics"], mental: ["Confident", "Outgoing", "Disciplined"], physical: ["Fit", "Athletic Build", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Clumsy", "Stiff"], physical: ["Overweight", "Weak", "Ugly"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["huge", "giant"], genitals: [] } }, "Yvela Mushroom": { desires: { skills: ["Performance", "Acting", "Music"], mental: ["Outgoing", "Creative"], physical: ["Attractive", "Flexible"], bodyParts: [], chestSize: ["small", "flat"], buttSize: ["small", "flat"], genitals: [] }, willingToTrade: { skills: ["Martial Arts"], mental: ["Competitive"], physical: [], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Teaching", "Athletics", "Yoga"], mental: ["Confident", "Ambitious", "Disciplined"], physical: ["Fit", "Athletic Build", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Shy", "Submissive"], physical: ["Overweight", "Weak", "Clumsy", "Stiff", "Ugly"], bodyParts: [], chestSize: ["flat masculine"], buttSize: ["flat masculine"], genitals: [] } }, "Banana Banana": { desires: { skills: ["Customer Service", "Social Media"], mental: ["Creative", "Outgoing"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Music"], mental: ["Talkative"], physical: ["Youthful", "Quick"], bodyParts: [], chestSize: ["medium"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Cooking", "Art"], mental: ["Friendly", "Optimistic", "Energetic", "Bubbly"], physical: ["Friendly Tone", "Fashionable"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cynical", "Rude", "Introverted"], physical: ["Ugly", "Mature", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Xenis Aku": { desires: { skills: ["Navigation", "Mechanical Repair"], mental: ["Organized", "Patient"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: ["Introverted"], physical: ["Mature", "Relaxed"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Driving", "Customer Service", "First Aid"], mental: ["Calm", "Honest", "Reliable", "Thoughtful"], physical: ["Sturdy", "Calm Voice"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Unreliable", "Reckless", "Aggressive"], physical: ["Weak", "Clumsy", "Youthful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Zanithar Galdenentri": { desires: { skills: ["Medicine", "Teaching"], mental: ["Wise", "Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Writing", "Languages"], mental: ["Paranoid", "Erratic", "Obsessive"], physical: ["Underweight", "Mumbly Voice", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: [], mental: ["Crazy", "Eccentric", "Intelligent", "Bookworm"], physical: ["Mature", "Freckled"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Magic Theory"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Dull", "Foolish", "Simple"], physical: ["Muscular", "Attractive", "Youthful"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Trixie Rye": { desires: { skills: ["Management", "Business"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Dancing"], mental: ["Sly"], physical: ["Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Serving", "High Heels Proficient", "Customer Service", "Persuasion"], mental: ["Confident", "Flirty", "Witty", "Outgoing"], physical: ["Attractive", "Voluptuous", "Graceful", "Charming Tone"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Honest"], physical: ["Ugly", "Plain", "Clumsy", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Butt Johnson": { desires: { skills: ["Gaming", "Coding", "Tech-Savvy", "Social Media", "Animation", "Video Editing"], mental: ["Focused", "Organized", "Confident", "Witty"], physical: ["Fit", "Attractive", "Lean", "Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Forklift Certified"], mental: ["Lazy", "Disorganized", "Forgetful", "Shy", "Awkward"], physical: ["Overweight", "Plain", "Blemished", "Unkempt"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Gaming", "Coding", "Tech-Savvy"], mental: ["Nerd", "Introverted", "Obsessive"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, neverTrade: { skills: ["Social Media"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: true }, wontTradeFor: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Revna McKraken": { desires: { skills: ["High Heels Proficient", "Modeling", "Dancing", "Management", "Athletics", "Tech-Savvy", "Coding"], mental: ["Alluring", "Witty", "Efficient", "Quick Learner", "Shrewd"], physical: ["Smooth Skin", "Sharp Features", "Soft", "Flexible", "Fashionable"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Sexually Skilled", "Stealth", "Persuasion", "Acting", "Languages", "Product Knowledge", "Martial Arts", "Gardening", "Writing", "Medicine", "Combat", "High Heels Proficient", "Modeling", "Dancing", "Management", "Athletics", "Tech-Savvy", "Coding", "Occult Expert"], mental: ["Charming", "Diplomatic", "Bookworm", "Seductive", "Intelligent", "Moody", "Sly", "Confident", "Creative", "Patient", "Perceptive", "Deceitful", "Goth", "Silky Voice", "Alluring", "Witty", "Efficient", "Quick Learner", "Shrewd"], physical: ["Pale Skin", "Attractive", "Graceful", "Voluptuous", "Quick Reflexes", "Smooth Skin", "Sharp Features", "Soft", "Flexible", "Fashionable", "Definitely not a Vampire"], bodyParts: ["gender", "skinTone", "hairColor", "hairLength", "age"], chestSize: ["giant"], buttSize: ["giant"], genitals: ["vagina"], name: true, job: true }, wontTradeFor: { skills: ["Math Skills", "Plumbing", "Swimmer", "Swimming", "Makeup", "Cooking", "Photography", "Maid", "Singing", "Serving", "Hair Styling", "Cleaning", "Trading", "Driving", "Lock Picking", "First Aid", "Construction", "Heavy Lifting", "Social Media", "Baking", "Public Speaking", "Art", "Painting", "Music", "Guitar", "Piano", "Teaching", "Sales", "Accounting", "Legal Knowledge", "Foreign Language", "Yoga", "Retail", "Troubleshooting", "Forklift Certified", "Inventory Management", "Customer Service", "Were-Creature", "Sunfish", "BtestBraitBeesBigBeenore"], mental: ["Swift", "Silver-Tongued", "Bimbo", "Pensive", "Jock", "Naturally Gifted", "Extroverted", "Introverted", "Bitchy", "Kind", "Honest", "Dominant", "Submissive", "Shy", "Aggressive", "Passive", "Optimistic", "Pessimistic", "Cruel", "Empathetic", "Stubborn", "Flexible", "Jealous", "Supportive", "Friendly", "Competitive", "Logical", "Lazy", "Hardworking", "Arrogant", "Humble", "Paranoid", "Trusting", "Ambitious", "Complacent", "Dull", "Brave", "Cowardly", "Mature", "Immature", "Impatient", "Wise", "Foolish", "Analytical", "Outgoing", "Curious", "Calm", "Energetic", "Thoughtful", "Chill", "Nonchalant", "Organized", "Resourceful", "Focused", "Disciplined", "Determined", "Steadfast", "Considerate", "Polite", "Funny", "Reassuring", "Loyal", "Talkative", "Direct", "Negotiator", "Crafty", "Workaholic", "High Stamina", "Flirty", "Warm", "Lucky", "Blunt", "Perfectionist", "Overthinker", "Unpredictable", "Risk Taker", "Impulsive", "Cynical", "Quiet", "Awkward", "Tone Deaf", "Tease", "Clingy", "Sensitive", "Corporate Drone", "Forgetful", "Disorganized", "Selfish", "Erratic", "Obsessive", "Insecure", "Short Tempered", "Rude", "Unreliable", "Slow Learner", "Reckless", "Cold", "Insensitive", "Unskilled", "Unlucky", "Nerd", "Geek", "Prep", "Tomboy", "Femboy", "Diva", "High Energy", "Deep Thinker", "Monotone Expression", "Sarcastic", "Artistic", "Relaxed", "Humorous", "Detail-Oriented", "Customer-Focused", "Punctual", "Naive", "Tech Savvy"], physical: ["Tall", "Short", "Curvy", "Lean", "Muscular", "Pierced", "Youthful", "Mature", "Tan Skin", "Dark Skin", "Plain", "Ugly", "Fit", "Overweight", "Underweight", "Strong", "Clumsy", "Weak", "Stiff", "Freckled", "Blemished", "Tattooed", "Athletic Build", "Petite", "Broad-shouldered", "Quick", "Sturdy", "Scarred", "Short Hair", "Long Hair", "Fast", "Slow"], bodyParts: [], chestSize: [], buttSize: [], genitals: ["small penis", "penis", "big penis", "tight vagina", "vagina", "loose vagina"] } }, "Purple Wood": { desires: { skills: ["Languages", "Coding", "Math Skills"], mental: ["Intelligent", "Analytical", "Logical", "Wise"], physical: [], bodyParts: [], chestSize: ["medium", "large"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: [], mental: ["Bimbo", "Moody"], physical: ["Pierced"], bodyParts: [], chestSize: ["small"], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Art", "Music", "Painting", "Writing"], mental: ["Creative", "Introverted", "Goth"], physical: ["Attractive", "Tattooed", "Graceful"], bodyParts: [], chestSize: [], buttSize: ["huge"], genitals: [] }, neverTrade: { skills: [], mental: [], physical: ["Pale Skin"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Cruel", "Optimistic", "Prep"], physical: ["Plain", "Fashionable", "Muscular"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Luna Snow": { desires: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Art", "Music", "Guitar"], mental: ["Stubborn", "Artistic", "Wise", "Intelligent", "Lucky", "Bookworm", "Creative", "Calm", "Funny", "Charming", "Charismatic Voice", "Warm"], physical: ["Short", "Attractive", "Youthful", "Curvy", "Fit"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: true, job: true }, wontTradeFor: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } } }>> /* ================================== */ /* === NPC TRADING PREFERENCE FUNCTIONS === */ /* ================================== */ /* Function to check if NPC has trading preferences defined */ <<set setup.getNPCPreferences = function(npcNameOrObject) { /* If passed an NPC object, use their permanent ID */ if (typeof npcNameOrObject === 'object' && npcNameOrObject.permanentId) { return setup.npcTradingPreferences[npcNameOrObject.permanentId] || null; } /* Otherwise treat as name string */ return setup.npcTradingPreferences[npcNameOrObject] || null; }>> /* Function to calculate preference-based trade chance modifier */ <<set setup.calculatePreferenceModifier = function(npc, playerPackage, npcPackage) { var preferences = setup.getNPCPreferences(npc); if (!preferences) return 0; var modifier = 0; // Check what player is OFFERING that NPC desires if (preferences.desires) { if (playerPackage.skills && preferences.desires.skills) { playerPackage.skills.forEach(function(skill) { if (preferences.desires.skills.includes(skill)) { modifier += 30; } }); } if (playerPackage.mental && preferences.desires.mental) { playerPackage.mental.forEach(function(trait) { if (preferences.desires.mental.includes(trait)) { modifier += 15; } }); } if (playerPackage.physical && preferences.desires.physical) { playerPackage.physical.forEach(function(trait) { if (preferences.desires.physical.includes(trait)) { modifier += 15; } }); } if (playerPackage.bodyParts && preferences.desires.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (preferences.desires.bodyParts.includes(part.name)) { modifier += 20; } }); } } // Check what player is REQUESTING that NPC is reluctant to trade if (preferences.reluctantToTrade) { if (npcPackage.skills && preferences.reluctantToTrade.skills) { npcPackage.skills.forEach(function(skill) { if (preferences.reluctantToTrade.skills.includes(skill)) { modifier -= 20; } }); } if (npcPackage.mental && preferences.reluctantToTrade.mental) { npcPackage.mental.forEach(function(trait) { if (preferences.reluctantToTrade.mental.includes(trait)) { modifier -= 15; } }); } if (npcPackage.physical && preferences.reluctantToTrade.physical) { npcPackage.physical.forEach(function(trait) { if (preferences.reluctantToTrade.physical.includes(trait)) { modifier -= 50; } }); } if (npcPackage.bodyParts && preferences.reluctantToTrade.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (preferences.reluctantToTrade.bodyParts.includes(part.name)) { modifier -= 25; } }); } } return modifier; }>> /* Function to check if trade is blocked by NPC's "never trade" or "wont trade for" rules */ <<set setup.isTradeBlocked = function(npc, playerPackage, npcPackage) { var preferences = setup.getNPCPreferences(npc); if (!preferences) return false; // Check "never trade" - things NPC won't give away (only check npcPackage - what NPC actually has and is offering) if (preferences.neverTrade) { var neverTrade = preferences.neverTrade; // Check if player is requesting NPC's name if (neverTrade.name && npcPackage.name && npcPackage.name.length > 0) { return true; } // Check if player is requesting NPC's job if (neverTrade.job && npcPackage.job !== null && npcPackage.job !== undefined) { return true; } // ONLY block if the NPC is actually offering these items (they're in npcPackage) if (npcPackage.skills && neverTrade.skills) { for (var i = 0; i < npcPackage.skills.length; i++) { if (neverTrade.skills.includes(npcPackage.skills[i])) { return true; } } } if (npcPackage.mental && neverTrade.mental) { for (var i = 0; i < npcPackage.mental.length; i++) { if (neverTrade.mental.includes(npcPackage.mental[i])) { return true; } } } if (npcPackage.physical && neverTrade.physical) { for (var i = 0; i < npcPackage.physical.length; i++) { if (neverTrade.physical.includes(npcPackage.physical[i])) { return true; } } } if (npcPackage.bodyParts && neverTrade.bodyParts) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (neverTrade.bodyParts.includes(npcPackage.bodyParts[i].name)) { return true; } } } // Check chest sizes in NPC package if (npcPackage.bodyParts && neverTrade.chestSize) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (npcPackage.bodyParts[i].name === "chest") { var npcChestSize = npc.bodyParts.chest; if (neverTrade.chestSize.includes(npcChestSize)) { return true; } } } } // Check butt sizes in NPC package if (npcPackage.bodyParts && neverTrade.buttSize) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (npcPackage.bodyParts[i].name === "butt") { var npcButtSize = npc.bodyParts.butt; if (neverTrade.buttSize.includes(npcButtSize)) { return true; } } } } // Check genitals in NPC package if (npcPackage.bodyParts && neverTrade.genitals) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (npcPackage.bodyParts[i].name === "genitals") { var npcGenitals = npc.bodyParts.genitals; if (neverTrade.genitals.includes(npcGenitals)) { return true; } } } } } // Check "wont trade for" - things NPC won't accept from player (only check playerPackage) if (preferences.wontTradeFor) { var wontTradeFor = preferences.wontTradeFor; if (playerPackage.skills && wontTradeFor.skills) { for (var i = 0; i < playerPackage.skills.length; i++) { if (wontTradeFor.skills.includes(playerPackage.skills[i])) { return true; } } } if (playerPackage.mental && wontTradeFor.mental) { for (var i = 0; i < playerPackage.mental.length; i++) { if (wontTradeFor.mental.includes(playerPackage.mental[i])) { return true; } } } if (playerPackage.physical && wontTradeFor.physical) { for (var i = 0; i < playerPackage.physical.length; i++) { if (wontTradeFor.physical.includes(playerPackage.physical[i])) { return true; } } } if (playerPackage.bodyParts && wontTradeFor.bodyParts) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (wontTradeFor.bodyParts.includes(playerPackage.bodyParts[i].name)) { return true; } } } // Check chest sizes in player package if (playerPackage.bodyParts && wontTradeFor.chestSize) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (playerPackage.bodyParts[i].name === "chest") { var v = State.variables; var playerChestSize = v.bodyParts.chest; if (wontTradeFor.chestSize.includes(playerChestSize)) { return true; } } } } // Check butt sizes in player package if (playerPackage.bodyParts && wontTradeFor.buttSize) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (playerPackage.bodyParts[i].name === "butt") { var v = State.variables; var playerButtSize = v.bodyParts.butt; if (wontTradeFor.buttSize.includes(playerButtSize)) { return true; } } } } // Check genitals in player package if (playerPackage.bodyParts && wontTradeFor.genitals) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (playerPackage.bodyParts[i].name === "genitals") { var v = State.variables; var playerGenitals = v.bodyParts.genitals; if (wontTradeFor.genitals.includes(playerGenitals)) { return true; } } } } } return false; }>> /* Function to calculate preference-based value adjustment */ <<set setup.calculatePreferenceValueAdjustment = function(npc, playerPackage, npcPackage, baseValue) { var preferences = setup.getNPCPreferences(npc); if (!preferences) return baseValue; var multiplier = 1.0; // Items player is offering that NPC desires = reduce required payment if (preferences.desires) { if (playerPackage.skills && preferences.desires.skills) { playerPackage.skills.forEach(function(skill) { if (preferences.desires.skills.includes(skill)) { multiplier *= 0.85; // 15% discount per desired item } }); } if (playerPackage.mental && preferences.desires.mental) { playerPackage.mental.forEach(function(trait) { if (preferences.desires.mental.includes(trait)) { multiplier *= 0.85; } }); } if (playerPackage.physical && preferences.desires.physical) { playerPackage.physical.forEach(function(trait) { if (preferences.desires.physical.includes(trait)) { multiplier *= 0.85; } }); } } // Items NPC is reluctant to trade = increase required payment if (preferences.reluctantToTrade) { if (npcPackage.skills && preferences.reluctantToTrade.skills) { npcPackage.skills.forEach(function(skill) { if (preferences.reluctantToTrade.skills.includes(skill)) { multiplier *= 1.3; // 30% premium for reluctant items } }); } if (npcPackage.mental && preferences.reluctantToTrade.mental) { npcPackage.mental.forEach(function(trait) { if (preferences.reluctantToTrade.mental.includes(trait)) { multiplier *= 1.3; } }); } if (npcPackage.physical && preferences.reluctantToTrade.physical) { npcPackage.physical.forEach(function(trait) { if (preferences.reluctantToTrade.physical.includes(trait)) { multiplier *= 1.3; } }); } } return Math.round(baseValue * multiplier); }>>
/* ---------------------------------- */ /* --- TRADE EXECUTION FUNCTION --- */ /* ---------------------------------- */ // Helper function to check and assign gender-mismatch traits <<set setup.updateGenderMismatchTraits = function(character) { // If no character passed, assume player if (!character) { character = State.variables; } var gender = character.bodyParts.gender; var genitals = character.bodyParts.genitals; var traits = character.physicalTraits; // Remove both special traits first traits.delete("Cuntboy"); traits.delete("Futanari"); // Check for mismatch and add appropriate trait if (gender === "male" && (genitals === "tight vagina" || genitals === "vagina" || genitals === "loose vagina")) { if (!traits.includes("Cuntboy")) { traits.push("Cuntboy"); } } else if (gender === "female" && (genitals === "small penis" || genitals === "penis" || genitals === "big penis")) { if (!traits.includes("Futanari")) { traits.push("Futanari"); } } }>> <<set setup.attemptTrade = function(npc, playerPackage, npcPackage) { var v = State.variables; // Calculate trade chance with relationship and preference adjustments var playerValue = setup.calculateTradeValue(playerPackage, true); var npcValue = setup.calculateTradeValue(npcPackage, false); // Apply preference-based adjustments FIRST (willing/reluctant/desires) var adjustedNpcValue = setup.calculatePreferenceValueAdjustment(npc, playerPackage, npcPackage, npcValue); // THEN apply relationship-based threshold reduction var relLevel = (v.relationships[npc.name]) ? v.relationships[npc.name].level : 1; if (relLevel === 2) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.95); // 5% discount } else if (relLevel === 3) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.90); // 10% discount } else if (relLevel === 4) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.85); // 15% discount } else if (relLevel >= 5) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.80); // 20% discount (cap) } // Calculate chance with adjusted value var tradeChance = setup.calculateTradeChance(playerValue, adjustedNpcValue, npc, playerPackage, npcPackage); // Roll for success var roll = Math.random() * 100; var success = roll <= tradeChance; // Initialize result object var result = { success: success, playerGave: { name: [], physical: [], mental: [], skills: [], bodyParts: [], job: null }, playerReceived: { name: [], physical: [], mental: [], skills: [], bodyParts: [], job: null } }; if (success) { // Find the NPC in the main array var npcIndex = -1; for (var i = 0; i < v.npcs.length; i++) { if (v.npcs[i].name === npc.name) { npcIndex = i; break; } } if (npcIndex === -1) { return result; } // Work directly with the NPC in the array var targetNPC = v.npcs[npcIndex]; // RECORD WHAT PLAYER IS GIVING (before any swaps) if (playerPackage.name && playerPackage.name.length > 0) { playerPackage.name.forEach(function(nameItem) { result.playerGave.name.push({type: nameItem.type, value: nameItem.value}); }); } if (playerPackage.physical) { playerPackage.physical.forEach(function(trait) { result.playerGave.physical.push(trait); }); } if (playerPackage.mental) { playerPackage.mental.forEach(function(trait) { result.playerGave.mental.push(trait); }); } if (playerPackage.skills) { playerPackage.skills.forEach(function(skill) { result.playerGave.skills.push(skill); }); } if (playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { var partValue = part.name === "chest" ? v.bodyParts.chest : part.name === "butt" ? v.bodyParts.butt : part.name === "gender" ? v.bodyParts.gender : part.name === "genitals" ? v.bodyParts.genitals : part.name === "skinTone" ? v.appearance.skinTone : part.name === "hairColor" ? v.appearance.hairColor : part.name === "hairLength" ? v.appearance.hairLength : part.name === "age" ? v.appearance.age : ""; result.playerGave.bodyParts.push({name: part.name, value: partValue}); }); } if (playerPackage.job !== null && playerPackage.job !== undefined) { var playerOldJob = v.jobs && v.jobs.length > 0 ? v.jobs[0] : "Unemployed"; result.playerGave.job = playerOldJob; } // RECORD WHAT PLAYER IS RECEIVING (before any swaps) if (npcPackage.name && npcPackage.name.length > 0) { npcPackage.name.forEach(function(nameItem) { result.playerReceived.name.push({type: nameItem.type, value: nameItem.value}); }); } if (npcPackage.physical) { npcPackage.physical.forEach(function(trait) { result.playerReceived.physical.push(trait); }); } if (npcPackage.mental) { npcPackage.mental.forEach(function(trait) { result.playerReceived.mental.push(trait); }); } if (npcPackage.skills) { npcPackage.skills.forEach(function(skill) { result.playerReceived.skills.push(skill); }); } if (npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { var npcOriginalValue = part.name === "chest" ? targetNPC.bodyParts.chest : part.name === "butt" ? targetNPC.bodyParts.butt : part.name === "gender" ? targetNPC.bodyParts.gender : part.name === "genitals" ? targetNPC.bodyParts.genitals : part.name === "skinTone" ? targetNPC.appearance.skinTone : part.name === "hairColor" ? targetNPC.appearance.hairColor : part.name === "hairLength" ? targetNPC.appearance.hairLength : part.name === "age" ? targetNPC.appearance.age : ""; result.playerReceived.bodyParts.push({name: part.name, value: npcOriginalValue}); }); } if (playerPackage.job !== null && playerPackage.job !== undefined) { var npcOldJob = targetNPC.jobs && targetNPC.jobs.length > 0 ? targetNPC.jobs[0] : "Unemployed"; result.playerReceived.job = npcOldJob; } // NOW PERFORM THE ACTUAL SWAPS // Names if (playerPackage.name && playerPackage.name.length > 0) { // Store the old name for schedule update var oldNPCName = targetNPC.name; // Extract NPC name parts at the start var npcNameParts = targetNPC.name.split(" "); var npcFirst = npcNameParts[0] || ""; var npcLast = npcNameParts.slice(1).join(" ") || ""; // Perform swaps playerPackage.name.forEach(function(nameItem) { if (nameItem.type === "firstName") { var tempFirst = v.firstName; v.firstName = npcFirst; npcFirst = tempFirst; } else if (nameItem.type === "lastName") { var tempLast = v.lastName; v.lastName = npcLast; npcLast = tempLast; } }); // Rebuild NPC name with both parts var newNPCName; if (npcLast && npcLast.trim() !== "") { newNPCName = npcFirst + " " + npcLast; } else { newNPCName = npcFirst; } // Update the NPC's name in the array EXPLICITLY targetNPC.name = newNPCName; v.npcs[npcIndex].name = newNPCName; // CRITICAL: Update the location schedule key with the new name if (v.npcLocationSchedules && v.npcLocationSchedules[oldNPCName]) { v.npcLocationSchedules[newNPCName] = v.npcLocationSchedules[oldNPCName]; delete v.npcLocationSchedules[oldNPCName]; } // CRITICAL: Update old schedule system if it exists if (v.npcSchedules && v.npcSchedules[oldNPCName]) { v.npcSchedules[newNPCName] = v.npcSchedules[oldNPCName]; delete v.npcSchedules[oldNPCName]; } // CRITICAL: Update the relationship key with the new name using helper function setup.updateNPCRelationshipKey(oldNPCName, newNPCName); // CRITICAL: Update metNPCs array - remove ALL instances of old name, add new name once v.metNPCs = v.metNPCs.filter(function(name) { return name !== oldNPCName; }); if (!v.metNPCs.includes(newNPCName)) { v.metNPCs.push(newNPCName); } // CRITICAL: Update $tradingWithNPC reference v.tradingWithNPC = v.npcs[npcIndex]; } // Physical traits - player gives to NPC if (playerPackage.physical) { playerPackage.physical.forEach(function(trait) { v.physicalTraits.delete(trait); // Check for conflicts with NPC's existing traits var conflict = setup.getConflictingTrait(trait, targetNPC.physicalTraits); if (conflict) { targetNPC.physicalTraits.delete(conflict); } if (!targetNPC.physicalTraits.includes(trait)) { targetNPC.physicalTraits.push(trait); // Auto-adjust body parts if it's a body type trait if (setup.bodyTypeRequirements[trait]) { setup.adjustBodyPartsForTrait(trait, false, targetNPC); } } }); } // Mental traits - player gives to NPC if (playerPackage.mental) { playerPackage.mental.forEach(function(trait) { // Special handling for Bimbo trait - deactivate for player if (trait === "Bimbo") { setup.deactivateBimboTrait(v); } // Check if it's the character creation trait if (trait === v.characterCreationTrait) { v.characterCreationTrait = null; } else { v.mentalTraits.delete(trait); } // Check for conflicts with NPC's existing traits var conflict = setup.getConflictingTrait(trait, targetNPC.mentalTraits); if (conflict) { targetNPC.mentalTraits.delete(conflict); } if (!targetNPC.mentalTraits.includes(trait)) { targetNPC.mentalTraits.push(trait); // Special handling for Bimbo trait - activate for NPC if (trait === "Bimbo") { setup.activateBimboTrait(targetNPC); } } }); } // Skills - player gives to NPC if (playerPackage.skills) { playerPackage.skills.forEach(function(skill) { v.skills.delete(skill); if (!targetNPC.skills.includes(skill)) { targetNPC.skills.push(skill); } }); } // Body parts swap if (playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { var temp = v.bodyParts[part.name]; v.bodyParts[part.name] = targetNPC.bodyParts[part.name]; targetNPC.bodyParts[part.name] = temp; // Update gender-mismatch traits after swapping gender or genitals if (part.name === "gender" || part.name === "genitals") { setup.updateGenderMismatchTraits(v); setup.updateGenderMismatchTraits(targetNPC); } } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "age") { var temp = v.appearance[part.name]; v.appearance[part.name] = targetNPC.appearance[part.name]; targetNPC.appearance[part.name] = temp; } else if (part.name === "hairLength") { // Swap hair length var tempHairLength = v.appearance.hairLength; v.appearance.hairLength = targetNPC.appearance.hairLength; targetNPC.appearance.hairLength = tempHairLength; // Hair length traits are kept for bonus calculations but filtered from display // So we need to swap them too var playerHadShort = v.physicalTraits.includes("Short Hair"); var playerHadLong = v.physicalTraits.includes("Long Hair"); var npcHadShort = targetNPC.physicalTraits.includes("Short Hair"); var npcHadLong = targetNPC.physicalTraits.includes("Long Hair"); // Remove old traits v.physicalTraits.delete("Short Hair"); v.physicalTraits.delete("Long Hair"); targetNPC.physicalTraits.delete("Short Hair"); targetNPC.physicalTraits.delete("Long Hair"); // Swap the traits if (npcHadShort) v.physicalTraits.push("Short Hair"); if (npcHadLong) v.physicalTraits.push("Long Hair"); if (playerHadShort) targetNPC.physicalTraits.push("Short Hair"); if (playerHadLong) targetNPC.physicalTraits.push("Long Hair"); } }); } // NPC gives traits/skills to player if (npcPackage.physical) { npcPackage.physical.forEach(function(trait) { targetNPC.physicalTraits.delete(trait); // Check for conflicts with player's existing traits var conflict = setup.getConflictingTrait(trait, v.physicalTraits); if (conflict) { v.physicalTraits.delete(conflict); } if (!v.physicalTraits.includes(trait)) { v.physicalTraits.push(trait); // Auto-adjust body parts if it's a body type trait if (setup.bodyTypeRequirements[trait]) { setup.adjustBodyPartsForTrait(trait, true); } } }); } if (npcPackage.mental) { npcPackage.mental.forEach(function(trait) { // Special handling for Bimbo trait - deactivate for NPC if (trait === "Bimbo") { setup.deactivateBimboTrait(targetNPC); } targetNPC.mentalTraits.delete(trait); // Check for conflicts with player's existing traits var conflict = setup.getConflictingTrait(trait, v.mentalTraits); if (conflict) { // If conflict is the character creation trait, remove it if (conflict === v.characterCreationTrait) { v.characterCreationTrait = null; } else { v.mentalTraits.delete(conflict); } } // Add to mental traits (character creation traits become regular traits when received) if (!v.mentalTraits.includes(trait)) { v.mentalTraits.push(trait); // Special handling for Bimbo trait - activate for player if (trait === "Bimbo") { setup.activateBimboTrait(v); } } }); } if (npcPackage.skills) { npcPackage.skills.forEach(function(skill) { targetNPC.skills.delete(skill); if (!v.skills.includes(skill)) { v.skills.push(skill); } }); } // Job swap if (playerPackage.job !== null && playerPackage.job !== undefined) { var playerOldJob = v.jobs && v.jobs.length > 0 ? v.jobs[0] : "Unemployed"; var npcOldJob = targetNPC.jobs && targetNPC.jobs.length > 0 ? targetNPC.jobs[0] : "Unemployed"; // Update player's job to what NPC had if (npcOldJob !== "Unemployed") { v.jobs = [npcOldJob]; v.homeless = false; } else { v.jobs = []; } // Update NPC's job - replace only the FIRST job, keep others if (playerOldJob !== "Unemployed") { if (targetNPC.jobs.length > 1) { // NPC has multiple jobs - replace the first one targetNPC.jobs[0] = playerOldJob; } else { // NPC has one or no jobs - set as single job targetNPC.jobs = [playerOldJob]; } } else { // Player gave Unemployed - remove first job but keep others if (targetNPC.jobs.length > 1) { targetNPC.jobs.shift(); // Remove first job } else { targetNPC.jobs = []; } } // Note: Job-based locations are handled automatically by setup.getNPCLocation() // which checks the NPC's primary job and returns the appropriate location // No need to manually update schedules } // Update the reference v.tradingWithNPC = targetNPC; // Calculate and apply relationship points BEFORE clearing packages var relationshipPoints = setup.addTradeRelationshipBonus(npc, playerPackage, npcPackage); if (relationshipPoints !== 0) { setup.addRelationshipPoints(npc.name, relationshipPoints); } // Store relationship points in result for display result.relationshipChange = relationshipPoints; // Decrease trades remaining v.tradesRemainingToday -= 1; // Clear trade packages v.playerTradePackage = {stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: []}; v.npcTradePackage = {stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: []}; } else { // Trade failed v.failedTradesWithToday.push(npc.name); v.tradesRemainingToday -= 1; result.relationshipChange = 0; } return result; }>>
/* ---------------------------------- */ /* --- UPDATE NPC SCHEDULE FOR JOB --- */ /* ---------------------------------- */ <<set setup.updateNPCScheduleForJob = function(npcName, newJob) { var v = State.variables; // Job-specific schedules var jobSchedules = { "Unemployed": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening", "night"], alwaysAvailable: true }, "Street Performer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["afternoon", "evening"], alwaysAvailable: false }, "Package Courier": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Construction Worker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Dock Worker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Security Guard": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Baker": { days: ["Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Maid": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Fitness Shop Clerk": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Tech Store Clerk": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Adult Store Clerk": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["afternoon", "evening", "night"], alwaysAvailable: false }, "Beauty Salon Stylist": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Ecentric Shop Worker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Brothel Worker": { days: ["Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Brothel Owner": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["afternoon", "evening", "night"], alwaysAvailable: false }, "City Mayor": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Mayor's Secretary": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Hooker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Stripper": { days: ["Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Prostitute": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Model": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Bouncer": { days: ["Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Porn Star": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["afternoon", "evening"], alwaysAvailable: false }, "Social Media Influencer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Black Market Dealer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["night"], alwaysAvailable: false }, "Police Officer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening", "night"], alwaysAvailable: false }, "Clinic Assistant": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Data Analyst": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Negotiator": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["afternoon", "evening"], alwaysAvailable: false }, "Enforcer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false } }; // Update the NPC's schedule var newSchedule = jobSchedules[newJob]; if (newSchedule) { v.npcSchedules[npcName] = newSchedule; } else { // Default schedule if job not found v.npcSchedules[npcName] = { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }; } }>>
/* ---------------------------------- */ /* --- PLAYER DIALOGUE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerDialogue = function(topic) { var v = State.variables; var dialogues = []; if (topic === "compliment") { // Layer 1: Primary personality modifiers if (v.mentalTraits.includes("Flirty") || v.mentalTraits.includes("Seductive")) { if (v.mentalTraits.includes("Confident")) { dialogues.push("You know, you're looking absolutely stunning today... and I bet you know it too."); dialogues.push("Damn, you're gorgeous. I'm not even trying to be subtle here."); } else if (v.mentalTraits.includes("Shy")) { dialogues.push("Um... you're really... really attractive... I hope that's not too forward..."); dialogues.push("I've been thinking... you're beautiful... sorry if that's weird..."); } else { dialogues.push("You're looking absolutely stunning today..."); dialogues.push("I have to say, you're really attractive. Like, really attractive."); dialogues.push("Has anyone ever told you how gorgeous you are?"); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward") || v.mentalTraits.includes("Insecure")) { if (v.mentalTraits.includes("Kind")) { dialogues.push("Um... I just wanted to say... you seem really nice... and you look nice too..."); dialogues.push("Sorry if this is awkward, but... I think you're a really good person..."); } else if (v.mentalTraits.includes("Honest")) { dialogues.push("I'm not good at this, but... honestly, you're pretty great..."); dialogues.push("This is hard to say, but... I think you're cool. Really cool."); } else { dialogues.push("Um... you look... you look really nice today..."); dialogues.push("I just wanted to say... you're... you're pretty cool..."); dialogues.push("Sorry if this is weird, but... I think you're really great..."); } } else if (v.mentalTraits.includes("Confident") || v.mentalTraits.includes("Charming")) { if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm")) { dialogues.push("You're looking fantastic today! Seriously, you've got such great energy!"); dialogues.push("I just have to say - you're an amazing person and it shows!"); } else if (v.mentalTraits.includes("Arrogant")) { dialogues.push("You know, for most people I wouldn't bother, but you're actually impressive."); dialogues.push("I don't give compliments often, but you're worthy of one. You look good."); } else { dialogues.push("You're looking great today! Seriously, you've got style."); dialogues.push("I appreciate what you bring to the table. You're a good person."); dialogues.push("Just wanted to let you know - you're pretty awesome."); } } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt") || v.mentalTraits.includes("Honest")) { if (v.mentalTraits.includes("Rude")) { dialogues.push("You don't look terrible. That's something."); dialogues.push("I guess you look okay. Better than most people here."); } else if (v.mentalTraits.includes("Kind")) { dialogues.push("I'm just being honest - you're a really good person and I respect that."); dialogues.push("Straight up, you're great. That's just the truth."); } else { dialogues.push("You look good. That's all."); dialogues.push("I respect you. Thought you should know."); dialogues.push("You're a solid person. Just being honest."); } } else if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm") || v.mentalTraits.includes("Kind")) { if (v.mentalTraits.includes("Energetic") || v.mentalTraits.includes("Talkative")) { dialogues.push("Oh my gosh, I just have to tell you - you're such a wonderful person! Like, genuinely amazing!"); dialogues.push("You're so great! Every time I see you it just makes my day better! You're the best!"); } else { dialogues.push("Hey, I just wanted to say you're a really great person!"); dialogues.push("You always brighten up the room, you know that?"); dialogues.push("I really enjoy spending time with you. You're awesome!"); } } else if (v.mentalTraits.includes("Sarcastic") || v.mentalTraits.includes("Witty")) { dialogues.push("I'm shocked to say this, but... you're actually pretty cool. Who knew?"); dialogues.push("Against all odds, you've managed to be impressive. Congratulations."); dialogues.push("Well, well... looks like someone's doing something right. Good for you."); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If I may say so, you carry yourself very well. It's quite admirable."); dialogues.push("I wanted to express my appreciation for your character. You're quite remarkable."); dialogues.push("Please allow me to say - you're a truly commendable individual."); } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("Yeah, you're pretty cool. Just thought I'd mention it."); dialogues.push("You're alright. Better than alright, actually."); dialogues.push("Gotta say, you're a good person to know."); } else { dialogues.push("I think you're really cool, honestly."); dialogues.push("You seem like a good person. Just thought I'd say that."); dialogues.push("You're pretty great, you know?"); } } else if (topic === "insult") { // Insults based on personality if (v.mentalTraits.includes("Bitchy") || v.mentalTraits.includes("Rude")) { if (v.mentalTraits.includes("Arrogant")) { dialogues.push("You're pathetic. Like, genuinely beneath me. It's almost sad."); dialogues.push("I've met garbage with more class than you. And I'm not even exaggerating."); } else if (v.mentalTraits.includes("Sarcastic")) { dialogues.push("Oh wow, you're just SO impressive. Really. I'm in awe of your mediocrity."); dialogues.push("Congratulations on being the most disappointing person I've met today. And that's saying something."); } else { dialogues.push("You know what? You're kind of pathetic, honestly."); dialogues.push("Wow, you're even more annoying than I thought."); dialogues.push("Do everyone a favor and shut up for once."); } } else if (v.mentalTraits.includes("Aggressive") || v.mentalTraits.includes("Short Tempered")) { if (v.mentalTraits.includes("Dominant")) { dialogues.push("You're really pissing me off right now! Know your place!"); dialogues.push("I'm done with your shit! You need to back the hell off!"); } else if (v.mentalTraits.includes("Impulsive") || v.mentalTraits.includes("Reckless")) { dialogues.push("You know what?! FUCK YOU! I don't need this!"); dialogues.push("That's IT! You're a complete asshole and I'm DONE!"); } else { dialogues.push("You're really pissing me off right now!"); dialogues.push("I'm sick of your attitude!"); dialogues.push("You know what your problem is? Everything."); } } else if (v.mentalTraits.includes("Cruel") || v.mentalTraits.includes("Cold") || v.mentalTraits.includes("Insensitive")) { if (v.mentalTraits.includes("Calm")) { dialogues.push("You're worthless. Completely worthless. And that's just an objective fact."); dialogues.push("I don't know why anyone tolerates you. I certainly don't plan to."); } else if (v.mentalTraits.includes("Blunt")) { dialogues.push("You're a waste of space. That's not an insult, it's an observation."); dialogues.push("Honestly? You're garbage. Pure garbage."); } else { dialogues.push("You're worthless. Completely worthless."); dialogues.push("I don't know why anyone tolerates you."); dialogues.push("You're a waste of space."); } } else if (v.mentalTraits.includes("Sarcastic") || v.mentalTraits.includes("Witty")) { if (v.mentalTraits.includes("Arrogant")) { dialogues.push("Oh wow, you're just SO impressive. Really. I'm trembling with awe at your incompetence."); dialogues.push("Bravo. Truly. You've somehow managed to be even more disappointing than I expected."); } else if (v.mentalTraits.includes("Cynical")) { dialogues.push("Congratulations on being the most mediocre person I've met. And I meet a lot of mediocre people."); dialogues.push("Your personality is about as exciting as watching paint dry. Actually, paint drying is more interesting."); } else { dialogues.push("Oh wow, you're just SO impressive. Really."); dialogues.push("Congratulations on being the most mediocre person I've met today."); dialogues.push("Your personality is about as exciting as watching paint dry."); } } else if (v.mentalTraits.includes("Blunt") || v.mentalTraits.includes("Direct")) { if (v.mentalTraits.includes("Honest")) { dialogues.push("You're annoying. That's just the truth."); dialogues.push("I don't like you. I'm just being honest here."); } else { dialogues.push("You're annoying. Plain and simple."); dialogues.push("I don't like you. At all."); } } else if (v.mentalTraits.includes("Passive Aggressive") || v.mentalTraits.includes("Jealous")) { dialogues.push("Oh, how nice for you. Must be so easy being you. So... easy."); dialogues.push("Wow, you're just perfect, aren't you? Absolutely perfect. *Clearly sarcastic*"); dialogues.push("I'm SO happy for you. Really. Can't you tell how happy I am?"); } else if (v.mentalTraits.includes("Moody") || v.mentalTraits.includes("Erratic")) { dialogues.push("You know what? I'm DONE with you! You're terrible!"); dialogues.push("Ugh! You're SO annoying! I can't even deal with you right now!"); dialogues.push("Why are you like this?! You're the WORST!"); } else { dialogues.push("You're really annoying, you know that?"); dialogues.push("I don't like you. At all."); dialogues.push("You're kind of terrible, honestly."); } } else if (topic === "opinion") { // Asking their opinion if (v.mentalTraits.includes("Insecure") || v.mentalTraits.includes("Anxious")) { if (v.mentalTraits.includes("Shy")) { dialogues.push("Um... can I ask... what do you think of me? I'm... I'm really nervous to hear it..."); dialogues.push("I've been wondering... do you think I'm... okay? As a person? Sorry if that's weird..."); } else if (v.mentalTraits.includes("Sensitive")) { dialogues.push("Please be gentle, but... what do you honestly think of me? I'm worried..."); dialogues.push("I need to know... what's your opinion of me? I can handle it... I think..."); } else { dialogues.push("So... what do you think of me? Be honest... I can take it..."); dialogues.push("I've been wondering... do you think I'm okay? As a person?"); dialogues.push("Can I ask... what's your honest opinion of me? I'm a bit nervous to hear it..."); } } else if (v.mentalTraits.includes("Arrogant") || v.mentalTraits.includes("Vain")) { if (v.mentalTraits.includes("Confident")) { dialogues.push("So, what do you think of me? And don't hold back - I already know I'm impressive, but I want to hear you say it."); dialogues.push("Give me your assessment. I'm obviously great, but I'm curious what you specifically appreciate about me."); } else if (v.mentalTraits.includes("Dominant")) { dialogues.push("Tell me what you think of me. I expect honesty, and I expect it to be positive."); dialogues.push("Your opinion of me - give it. Make it good."); } else { dialogues.push("So, what do you think of me? And don't hold back - I know I'm impressive."); dialogues.push("I'm curious what your assessment of me is. I already know I'm great, but go ahead."); dialogues.push("Give me your honest opinion of me. Though I'm sure it's positive."); } } else if (v.mentalTraits.includes("Curious") || v.mentalTraits.includes("Analytical")) { if (v.mentalTraits.includes("Direct")) { dialogues.push("What's your objective assessment of me? I'm collecting data."); dialogues.push("I need your honest evaluation. What do you think of me?"); } else if (v.mentalTraits.includes("Thoughtful")) { dialogues.push("I'm genuinely curious about your perception of me. How do you see me as a person?"); dialogues.push("I've been contemplating self-perception versus external perception. What's your honest view of me?"); } else { dialogues.push("I'm genuinely curious - what's your honest assessment of me as a person?"); dialogues.push("From your perspective, what kind of person do you think I am?"); dialogues.push("I'd like to know your objective opinion of me, if you don't mind sharing."); } } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { if (v.mentalTraits.includes("Honest")) { dialogues.push("What do you think of me? And I want the truth, not politeness."); dialogues.push("Give it to me straight - what's your real opinion of me?"); } else if (v.mentalTraits.includes("Confident")) { dialogues.push("What do you think of me? Don't sugarcoat it. I can handle honesty."); dialogues.push("Your opinion of me. Now. No bullshit."); } else { dialogues.push("What do you think of me? Don't sugarcoat it."); dialogues.push("Give it to me straight - what's your opinion of me?"); dialogues.push("Be honest. What do you think about me?"); } } else if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm")) { if (v.mentalTraits.includes("Talkative") || v.mentalTraits.includes("Outgoing")) { dialogues.push("Hey! I'd absolutely love to know what you think of me! Be totally honest - I really want to know!"); dialogues.push("Ooh, ooh! Tell me what you think about me! I'm so curious and I promise I won't be offended!"); } else if (v.mentalTraits.includes("Kind")) { dialogues.push("I'd really appreciate hearing what you think of me. Your opinion matters to me!"); dialogues.push("If you don't mind sharing, I'd love to know your thoughts about me as a person."); } else { dialogues.push("Hey, I'd love to know what you think of me! Honest opinions only!"); dialogues.push("So, what's your take on me? I'm genuinely interested!"); dialogues.push("I'm curious - how do you see me as a person?"); } } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("So what do you think of me? Just curious."); dialogues.push("What's your take on me?"); dialogues.push("Your opinion of me - what is it?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If I may ask, what is your opinion of me? I value your perspective."); dialogues.push("I would appreciate hearing your thoughts about me, if you're comfortable sharing."); dialogues.push("May I inquire as to your assessment of my character?"); } else { dialogues.push("What's your honest opinion of me?"); dialogues.push("So... what do you think of me?"); dialogues.push("I'm curious what you think about me."); } } else if (topic === "job") { // Asking about their job if (v.mentalTraits.includes("Curious") || v.mentalTraits.includes("Interested")) { if (v.mentalTraits.includes("Energetic") || v.mentalTraits.includes("Talkative")) { dialogues.push("Oh! What do you do for work?! I'm SO curious! Tell me everything!"); dialogues.push("I've been dying to know - what's your job? What's it like? Is it fun?!"); } else if (v.mentalTraits.includes("Analytical")) { dialogues.push("I'm quite interested in learning about your occupation. What field are you in?"); dialogues.push("What's your professional role? I'd like to understand more about what you do."); } else { dialogues.push("So what do you do for work? I'm really curious!"); dialogues.push("Tell me about your job! What's it like?"); dialogues.push("I'd love to hear about what you do for a living!"); } } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("So, what's your job?"); dialogues.push("What do you do for work?"); dialogues.push("You working anywhere?"); } else if (v.mentalTraits.includes("Professional") || v.mentalTraits.includes("Businesslike")) { dialogues.push("What's your current occupation?"); dialogues.push("May I ask what line of work you're in?"); dialogues.push("What's your professional role?"); } else if (v.mentalTraits.includes("Nosy") || v.mentalTraits.includes("Gossipy")) { dialogues.push("Okay, so I've been dying to know - what do you do for work?"); dialogues.push("Spill! What's your job? I need to know!"); dialogues.push("Come on, tell me - where do you work?"); } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { dialogues.push("What's your job?"); dialogues.push("Where do you work?"); dialogues.push("What do you do?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If you don't mind my asking, what is your occupation?"); dialogues.push("May I inquire about your line of work?"); dialogues.push("What do you do professionally, if I may ask?"); } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { dialogues.push("So... um... what do you do for work? If you don't mind me asking..."); dialogues.push("I was wondering... what's your job?"); dialogues.push("Can I ask... what do you do?"); } else { dialogues.push("What do you do for work?"); dialogues.push("So, what's your job?"); dialogues.push("What kind of work do you do?"); } } else if (topic === "trading") { // Asking about trading if (v.mentalTraits.includes("Shrewd") || v.mentalTraits.includes("Sly")) { if (v.mentalTraits.includes("Confident")) { dialogues.push("Let's talk business. I'm curious about your trading preferences. What catches your eye?"); dialogues.push("I think we could make some mutually beneficial arrangements. What interests you?"); } else if (v.mentalTraits.includes("Careful") || v.mentalTraits.includes("Cautious")) { dialogues.push("I'm exploring potential trading opportunities. What might you be interested in?"); dialogues.push("Hypothetically speaking, what would appeal to you in a trade?"); } else { dialogues.push("I'm curious about what you might be willing to trade. What interests you?"); dialogues.push("Let's talk business. What are you looking for in a trade?"); dialogues.push("So, hypothetically speaking... what would you be willing to trade?"); } } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { if (v.mentalTraits.includes("Businesslike")) { dialogues.push("Trading. Are you interested? What are your terms?"); dialogues.push("Let's discuss trading. What do you want?"); } else { dialogues.push("Are you interested in trading? What do you want?"); dialogues.push("Let's cut to the chase - what would you trade for?"); dialogues.push("Trading. You interested? What are you after?"); } } else if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm")) { if (v.mentalTraits.includes("Enthusiastic") || v.mentalTraits.includes("Energetic")) { dialogues.push("Hey! I was thinking - are you interested in trading? What kind of things would you love to get?!"); dialogues.push("Ooh! Trading! Are you into it? What are you looking for? I'm so curious!"); } else { dialogues.push("Hey, I was wondering if you'd ever be interested in trading? What kind of things appeal to you?"); dialogues.push("So, just curious - are you open to trading? What would you be looking for?"); dialogues.push("I'd love to know what you're interested in trading for!"); } } else if (v.mentalTraits.includes("Cautious") || v.mentalTraits.includes("Careful")) { if (v.mentalTraits.includes("Analytical")) { dialogues.push("I'm evaluating trading possibilities. What parameters would interest you?"); dialogues.push("From a practical standpoint, what would you consider for a trade?"); } else { dialogues.push("I wanted to ask... would you ever consider trading? What might you be interested in?"); dialogues.push("Just exploring options here - what would you potentially trade for?"); dialogues.push("Hypothetically, what kind of trades would interest you?"); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { dialogues.push("Um... so... I was wondering about trading? What would you... be interested in?"); dialogues.push("I wanted to ask... are you... open to trading? What do you like?"); dialogues.push("This might be awkward but... trading? Are you interested?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If you'd be amenable, I'd like to discuss trading possibilities. What might interest you?"); dialogues.push("Might I inquire about your trading preferences? What appeals to you?"); dialogues.push("Would you be open to discussing potential trades? What would you find valuable?"); } else { dialogues.push("Are you interested in trading? What are you looking for?"); dialogues.push("What would you be willing to trade for?"); dialogues.push("I'm curious about your trading preferences. What interests you?"); } } else if (topic === "smalltalk") { // Small talk if (v.mentalTraits.includes("Outgoing") || v.mentalTraits.includes("Talkative") || v.mentalTraits.includes("Energetic")) { if (v.mentalTraits.includes("Friendly")) { dialogues.push("Hey there! So! How's everything been going? What's new with you? Tell me everything!"); dialogues.push("Oh my gosh, hi! Let's just chat! How have you been? What's happening in your life?!"); } else if (v.mentalTraits.includes("Enthusiastic")) { dialogues.push("So! What's up?! How's life?! What have you been doing?!"); dialogues.push("Hey! Let's talk! What's been going on with you?!"); } else { dialogues.push("So! How's everything been going? What's new with you?"); dialogues.push("Hey! Let's chat! How have you been? What's going on?"); dialogues.push("I'm in the mood to just talk! How's life treating you?"); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { if (v.mentalTraits.includes("Kind")) { dialogues.push("Um... so... how have you been? I hope everything's okay..."); dialogues.push("I was just... wondering how things are going for you..."); } else if (v.mentalTraits.includes("Anxious")) { dialogues.push("So... um... the weather's been... okay... hasn't it? Sorry, I'm not good at this..."); dialogues.push("I... uh... how are things? Sorry if this is awkward..."); } else { dialogues.push("So... um... how are things?"); dialogues.push("I was just... wondering how you've been..."); dialogues.push("The weather's been... nice... hasn't it?"); } } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("What's up? How's it going?"); dialogues.push("So, what's new?"); dialogues.push("How've you been?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("Good day! How have you been faring lately?"); dialogues.push("I hope things have been going well for you?"); dialogues.push("How are you doing these days?"); } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { dialogues.push("How are you?"); dialogues.push("What's new?"); dialogues.push("Everything good?"); } else if (v.mentalTraits.includes("Sarcastic")) { dialogues.push("So... lovely weather we're having. Riveting stuff."); dialogues.push("How about that local sports team? Really giving it their all, I'm sure."); dialogues.push("What's new? Besides the crushing monotony of existence?"); } else if (v.mentalTraits.includes("Bitchy") || v.mentalTraits.includes("Rude")) { dialogues.push("So... we're really doing small talk? Fine. How are you or whatever."); dialogues.push("What's up. And don't bore me with your life story."); dialogues.push("How's it going. Keep it short."); } else { dialogues.push("So, how's everything going?"); dialogues.push("What's been happening with you?"); dialogues.push("How are things?"); } } // Default fallback if (dialogues.length === 0) { dialogues.push("..."); } return dialogues[Math.floor(Math.random() * dialogues.length)]; }>>
/* ---------------------------------- */ /* --- PLAYER IMAGE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerFaceImage = function() { var v = State.variables; // Initialize imageSettings if it doesn't exist if (!v.imageSettings) { v.imageSettings = { imagesEnabled: true, useAltFaces: false, locationImagesEnabled: true, // Added here customImages: { face: "", chest: "", butt: "" } }; } // Ensure useAltFaces exists for backwards compatibility if (v.imageSettings.useAltFaces === undefined) { v.imageSettings.useAltFaces = false; } // Ensure locationImagesEnabled exists for backwards compatibility if (v.imageSettings.locationImagesEnabled === undefined) { v.imageSettings.locationImagesEnabled = true; } // If images are disabled, return custom image or empty string if (!v.imageSettings.imagesEnabled) { return v.imageSettings.customImages.face || ""; } // Get basic appearance info var gender = v.bodyParts.gender === "male" ? "Male" : "Female"; var hairStyle = v.appearance.hairStyle === "messy" ? "Messy_" : ""; var hairLength = v.appearance.hairLength === "long" ? "Long" : "Short"; var skinTone = v.appearance.skinTone.charAt(0).toUpperCase() + v.appearance.skinTone.slice(1); var hairColorMap = { "Black": "Black", "Brown": "Brown", "Blonde": "Blonde", "Red": "Red", "Platinum Blonde": "Platinum" }; var hairColor = hairColorMap[v.appearance.hairColor] || v.appearance.hairColor; var age = v.appearance.age === "Mature Adult" ? "Mature" : "Adult"; // Build filename (same for both paths) var filename = gender + "_" + hairStyle + hairLength + "_" + skinTone + "_" + hairColor + "_" + age + ".webp"; // Check if using alternative face path if (v.imageSettings.useAltFaces === true) { // Alternative path structure: Images/Faces_Alt/{filename} return "Images/Faces_Alt/" + filename; } else { // Original path structure: Images/Faces/{filename} return "Images/Faces/" + filename; } }>> /* ---------------------------------- */ /* --- CHEST IMAGE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerChestImage = function() { var v = State.variables; // Initialize imageSettings if it doesn't exist if (!v.imageSettings) { v.imageSettings = { imagesEnabled: true, useAltFaces: false, locationImagesEnabled: true, // Added here customImages: { face: "", chest: "", butt: "" } }; } // If images are disabled, return custom image or empty string if (!v.imageSettings.imagesEnabled) { return v.imageSettings.customImages.chest || ""; } // Otherwise return default image path var skinTone = v.appearance.skinTone.charAt(0).toUpperCase() + v.appearance.skinTone.slice(1); var chestSizeMap = { "flat masculine": "Masculine_Flat", "flat": "Flat", "small": "Small", "medium": "Medium", "large": "Big", "huge": "Huge", "giant": "Giant", "gigantic": "Gigantic" }; var chestSize = chestSizeMap[v.bodyParts.chest.toLowerCase()] || "Flat"; var filename = chestSize + "_" + skinTone + ".webp"; return "Images/Chests/" + filename; }>> /* ---------------------------------- */ /* --- BUTT IMAGE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerButtImage = function() { var v = State.variables; // Initialize imageSettings if it doesn't exist if (!v.imageSettings) { v.imageSettings = { imagesEnabled: true, useAltFaces: false, locationImagesEnabled: true, // Added here customImages: { face: "", chest: "", butt: "" } }; } // If images are disabled, return custom image or empty string if (!v.imageSettings.imagesEnabled) { return v.imageSettings.customImages.butt || ""; } // Otherwise return default image path var skinTone = v.appearance.skinTone.charAt(0).toUpperCase() + v.appearance.skinTone.slice(1); var buttSizeMap = { "flat masculine": "Masculine_Flat", "flat": "Flat", "small": "Small", "medium": "Medium", "large": "Big", "huge": "Huge", "giant": "Giant", "gigantic": "Gigantic" }; var buttSize = buttSizeMap[v.bodyParts.butt.toLowerCase()] || "Flat"; var filename = buttSize + "_" + skinTone + ".webp"; return "Images/Butts/" + filename; }>>
/* ---------------------------------- */ /* --- TRANSFORMATION TEXT FUNCTIONS --- */ /* ---------------------------------- */ <<set setup.getChestTransformationText = function(oldSize, newSize) { var texts = []; var oldIndex = setup.chestSizeOrder.indexOf(oldSize.toLowerCase()); var newIndex = setup.chestSizeOrder.indexOf(newSize.toLowerCase()); var change = newIndex - oldIndex; if (change === 0) { return "Your chest remains unchanged."; } if (change > 0) { // Growing if (change === 1) { texts.push("You feel a subtle warmth in your chest as it swells slightly, filling out a bit more."); texts.push("A tingling sensation spreads across your chest as it grows modestly larger."); } else if (change === 2) { texts.push("Your chest tingles intensely as it expands noticeably, the weight becoming more pronounced."); texts.push("You gasp as your chest swells considerably, pushing outward with newfound fullness."); } else if (change >= 3) { texts.push("Your chest surges outward dramatically, growing substantially as intense waves of sensation course through you."); texts.push("You feel an overwhelming pressure as your chest expands massively, the transformation both shocking and profound."); } } else { // Shrinking change = Math.abs(change); if (change === 1) { texts.push("Your chest tingles as it diminishes slightly, becoming a bit smaller and lighter."); texts.push("You feel a subtle shift as your chest reduces modestly in size."); } else if (change === 2) { texts.push("Your chest shrinks noticeably, the reduction clearly visible as it becomes significantly smaller."); texts.push("A pulling sensation courses through your chest as it decreases considerably in size."); } else if (change >= 3) { texts.push("Your chest rapidly diminishes, shrinking dramatically as the transformation takes hold completely."); texts.push("You feel an intense pulling sensation as your chest reduces massively in size, the change profound and immediate."); } } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getGenitalTransformationText = function(oldType, newType) { if (oldType === newType) { return "Your genitals remain unchanged."; } var texts = []; var oldIsPenis = oldType.includes("penis"); var newIsPenis = newType.includes("penis"); if (oldIsPenis && newIsPenis) { // Penis size change if (newType === "big penis") { texts.push("A warm, intense sensation spreads through your groin as your penis swells and grows, expanding to a much larger size."); texts.push("You gasp as you feel your cock thickening and lengthening, the transformation leaving you substantially bigger."); } else if (newType === "small penis") { texts.push("A strange tingling sensation courses through your groin as your penis shrinks, becoming noticeably smaller."); texts.push("You feel your cock diminishing in size, the reduction leaving you with a smaller member."); } else { texts.push("Your penis shifts to an average size, the transformation settling into comfortable proportions."); } } else if (!oldIsPenis && !newIsPenis) { // Vagina tightness change if (newType === "tight vagina") { texts.push("A pleasant tightening sensation runs through your core as your vagina becomes tighter, the walls becoming more snug."); } else if (newType === "loose vagina") { texts.push("You feel your vagina relaxing and loosening, the internal muscles becoming more accommodating."); } else { texts.push("Your vagina shifts to an average tightness, finding a comfortable middle ground."); } } else if (oldIsPenis && !newIsPenis) { // Penis to vagina texts.push("An overwhelming sensation courses through your entire body as your penis begins to shrink inward. The transformation is profound and unmistakable - flesh reshaping, nerves rewiring. When it's complete, you have a vagina where your penis once was."); texts.push("You feel an intense pressure as your masculine genitals reshape themselves completely. The change is total and irreversible, leaving you with feminine anatomy in place of your former penis."); } else { // Vagina to penis texts.push("An overwhelming sensation courses through your entire body as new flesh begins to form and extend outward from your core. The transformation is profound and unmistakable - internal becoming external, nerves rewiring. When it's complete, you have a penis where your vagina once was."); texts.push("You feel an intense pressure as your feminine genitals reshape themselves completely. The change is total and irreversible, leaving you with masculine anatomy in place of your former vagina."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getButtTransformationText = function(oldSize, newSize) { var texts = []; var oldIndex = setup.buttSizeOrder.indexOf(oldSize.toLowerCase()); var newIndex = setup.buttSizeOrder.indexOf(newSize.toLowerCase()); var change = newIndex - oldIndex; if (change === 0) { return "Your butt remains unchanged."; } if (change > 0) { // Growing if (change === 1) { texts.push("You feel a pleasant warmth as your butt swells slightly, filling out a bit more."); texts.push("A tingling sensation spreads through your rear as it grows modestly larger."); } else if (change === 2) { texts.push("Your butt tingles intensely as it expands noticeably, becoming considerably fuller."); texts.push("You gasp as your rear swells substantially, the curves becoming much more pronounced."); } else if (change >= 3) { texts.push("Your butt surges outward dramatically, expanding massively as waves of sensation course through you."); texts.push("You feel an overwhelming pressure as your rear grows enormously, the transformation profound and immediate."); } } else { // Shrinking change = Math.abs(change); if (change === 1) { texts.push("Your butt tingles as it diminishes slightly, becoming a bit smaller and firmer."); texts.push("You feel a subtle shift as your rear reduces modestly in size."); } else if (change === 2) { texts.push("Your butt shrinks noticeably, the reduction clearly visible as it becomes significantly smaller."); texts.push("A pulling sensation courses through your rear as it decreases considerably in size."); } else if (change >= 3) { texts.push("Your butt rapidly diminishes, shrinking dramatically as the transformation takes hold completely."); texts.push("You feel an intense pulling sensation as your rear reduces massively in size, the change immediate and profound."); } } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getGenitalTransformationText = function(oldType, newType) { if (oldType === newType) { return "Your genitals remain unchanged."; } var texts = []; var oldIsPenis = oldType.includes("penis"); var newIsPenis = newType.includes("penis"); if (oldIsPenis && newIsPenis) { // Penis size change if (newType === "big penis") { texts.push("A warm, intense sensation spreads through your groin as your penis swells and grows, expanding to a much larger size."); texts.push("You gasp as you feel your cock thickening and lengthening, the transformation leaving you substantially bigger."); } else if (newType === "small penis") { texts.push("A strange tingling sensation courses through your groin as your penis shrinks, becoming noticeably smaller."); texts.push("You feel your cock diminishing in size, the reduction leaving you with a smaller member."); } else { texts.push("Your penis shifts to an average size, the transformation settling into comfortable proportions."); } } else if (!oldIsPenis && !newIsPenis) { // Vagina tightness change if (newType === "tight vagina") { texts.push("A pleasant tightening sensation runs through your core as your vagina becomes tighter, the walls becoming more snug."); } else if (newType === "loose vagina") { texts.push("You feel your vagina relaxing and loosening, the internal muscles becoming more accommodating."); } else { texts.push("Your vagina shifts to an average tightness, finding a comfortable middle ground."); } } else if (oldIsPenis && !newIsPenis) { // Penis to vagina texts.push("An overwhelming sensation courses through your entire body as your penis begins to shrink inward. The transformation is profound and unmistakable - flesh reshaping, nerves rewiring. When it's complete, you have a vagina where your penis once was."); texts.push("You feel an intense pressure as your masculine genitals reshape themselves completely. The change is total and irreversible, leaving you with feminine anatomy in place of your former penis."); } else { // Vagina to penis texts.push("An overwhelming sensation courses through your entire body as new flesh begins to form and extend outward from your core. The transformation is profound and unmistakable - internal becoming external, nerves rewiring. When it's complete, you have a penis where your vagina once was."); texts.push("You feel an intense pressure as your feminine genitals reshape themselves completely. The change is total and irreversible, leaving you with masculine anatomy in place of your former vagina."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getGenderTransformationText = function(oldGender, newGender) { if (oldGender === newGender) { return "Your gender remains unchanged."; } var texts = []; if (newGender === "female") { texts.push("Your entire body tingles as a profound transformation washes over you. Your frame shifts, curves emerging where there were none before. Your face softens, features becoming more delicate. The change is total and unmistakable - you are now female."); texts.push("An overwhelming wave of sensation courses through your entire being. Your body reshapes itself completely - hips widening, waist narrowing, your very essence transforming. When it's over, you stand as a woman."); } else { texts.push("Your entire body tingles as a profound transformation washes over you. Your frame broadens, muscles becoming more prominent. Your face takes on harder angles, your jawline becoming more pronounced. The change is total and unmistakable - you are now male."); texts.push("An overwhelming wave of sensation courses through your entire being. Your body reshapes itself completely - shoulders broadening, frame becoming more angular, your very essence transforming. When it's over, you stand as a man."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getGenitalTransformationText = function(oldType, newType) { if (oldType === newType) { return "Your genitals remain unchanged."; } var texts = []; var oldIsPenis = oldType.includes("penis"); var newIsPenis = newType.includes("penis"); if (oldIsPenis && newIsPenis) { // Penis size change if (newType === "big penis") { texts.push("A warm, intense sensation spreads through your groin as your penis swells and grows, expanding to a much larger size."); texts.push("You gasp as you feel your cock thickening and lengthening, the transformation leaving you substantially bigger."); } else if (newType === "small penis") { texts.push("A strange tingling sensation courses through your groin as your penis shrinks, becoming noticeably smaller."); texts.push("You feel your cock diminishing in size, the reduction leaving you with a smaller member."); } else { texts.push("Your penis shifts to an average size, the transformation settling into comfortable proportions."); } } else if (!oldIsPenis && !newIsPenis) { // Vagina tightness change if (newType === "tight vagina") { texts.push("A pleasant tightening sensation runs through your core as your vagina becomes tighter, the walls becoming more snug."); } else if (newType === "loose vagina") { texts.push("You feel your vagina relaxing and loosening, the internal muscles becoming more accommodating."); } else { texts.push("Your vagina shifts to an average tightness, finding a comfortable middle ground."); } } else if (oldIsPenis && !newIsPenis) { // Penis to vagina texts.push("An overwhelming sensation courses through your entire body as your penis begins to shrink inward. The transformation is profound and unmistakable - flesh reshaping, nerves rewiring. When it's complete, you have a vagina where your penis once was."); texts.push("You feel an intense pressure as your masculine genitals reshape themselves completely. The change is total and irreversible, leaving you with feminine anatomy in place of your former penis."); } else { // Vagina to penis texts.push("An overwhelming sensation courses through your entire body as new flesh begins to form and extend outward from your core. The transformation is profound and unmistakable - internal becoming external, nerves rewiring. When it's complete, you have a penis where your vagina once was."); texts.push("You feel an intense pressure as your feminine genitals reshape themselves completely. The change is total and irreversible, leaving you with masculine anatomy in place of your former vagina."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getSkinToneTransformationText = function(oldTone, newTone) { if (oldTone === newTone) { return "Your skin tone remains unchanged."; } return "Your skin tingles as its tone shifts, transforming from " + oldTone + " to " + newTone + "."; }>> <<set setup.getHairColorTransformationText = function(oldColor, newColor) { if (oldColor === newColor) { return "Your hair color remains unchanged."; } return "You feel a strange sensation across your scalp as your hair color changes from " + oldColor + " to " + newColor + "."; }>> <<set setup.getHairLengthTransformationText = function(oldLength, newLength) { if (oldLength === newLength) { return "Your hair length remains unchanged."; } var texts = []; if (newLength === "long" || newLength === "long hair") { texts.push("Your hair tingles as it flows downward, growing longer and longer until it reaches well past your shoulders."); texts.push("You feel your hair growing rapidly, cascading down your back as it extends to a much greater length."); } else { texts.push("Your hair tingles as it recedes upward, shortening considerably until it sits close to your head."); texts.push("You feel your hair pulling back, shortening rapidly until it's cropped close and manageable."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getGenitalTransformationText = function(oldType, newType) { if (oldType === newType) { return "Your genitals remain unchanged."; } var texts = []; var oldIsPenis = oldType.includes("penis"); var newIsPenis = newType.includes("penis"); if (oldIsPenis && newIsPenis) { // Penis size change if (newType === "big penis") { texts.push("A warm, intense sensation spreads through your groin as your penis swells and grows, expanding to a much larger size."); texts.push("You gasp as you feel your cock thickening and lengthening, the transformation leaving you substantially bigger."); } else if (newType === "small penis") { texts.push("A strange tingling sensation courses through your groin as your penis shrinks, becoming noticeably smaller."); texts.push("You feel your cock diminishing in size, the reduction leaving you with a smaller member."); } else { texts.push("Your penis shifts to an average size, the transformation settling into comfortable proportions."); } } else if (!oldIsPenis && !newIsPenis) { // Vagina tightness change if (newType === "tight vagina") { texts.push("A pleasant tightening sensation runs through your core as your vagina becomes tighter, the walls becoming more snug."); } else if (newType === "loose vagina") { texts.push("You feel your vagina relaxing and loosening, the internal muscles becoming more accommodating."); } else { texts.push("Your vagina shifts to an average tightness, finding a comfortable middle ground."); } } else if (oldIsPenis && !newIsPenis) { // Penis to vagina texts.push("An overwhelming sensation courses through your entire body as your penis begins to shrink inward. The transformation is profound and unmistakable - flesh reshaping, nerves rewiring. When it's complete, you have a vagina where your penis once was."); texts.push("You feel an intense pressure as your masculine genitals reshape themselves completely. The change is total and irreversible, leaving you with feminine anatomy in place of your former penis."); } else { // Vagina to penis texts.push("An overwhelming sensation courses through your entire body as new flesh begins to form and extend outward from your core. The transformation is profound and unmistakable - internal becoming external, nerves rewiring. When it's complete, you have a penis where your vagina once was."); texts.push("You feel an intense pressure as your feminine genitals reshape themselves completely. The change is total and irreversible, leaving you with masculine anatomy in place of your former vagina."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getAgeTransformationText = function(oldAge, newAge) { if (oldAge === newAge) { return "Your apparent age remains unchanged."; } var texts = []; if (newAge === "Mature Adult" || newAge === "Mature") { texts.push("You feel your features shifting subtly - fine lines appearing, your face taking on a more mature, distinguished appearance."); texts.push("Your appearance ages gracefully, gaining the wisdom and experience of years in moments."); } else { texts.push("You feel your features smoothing, becoming more youthful and vibrant. Years seem to fall away."); texts.push("Your appearance becomes more youthful, energy and vitality returning to your features."); } return texts[Math.floor(Math.random() * texts.length)]; }>> <<set setup.getGenitalTransformationText = function(oldType, newType) { if (oldType === newType) { return "Your genitals remain unchanged."; } var texts = []; var oldIsPenis = oldType.includes("penis"); var newIsPenis = newType.includes("penis"); if (oldIsPenis && newIsPenis) { // Penis size change if (newType === "big penis") { texts.push("A warm, intense sensation spreads through your groin as your penis swells and grows, expanding to a much larger size."); texts.push("You gasp as you feel your cock thickening and lengthening, the transformation leaving you substantially bigger."); } else if (newType === "small penis") { texts.push("A strange tingling sensation courses through your groin as your penis shrinks, becoming noticeably smaller."); texts.push("You feel your cock diminishing in size, the reduction leaving you with a smaller member."); } else { texts.push("Your penis shifts to an average size, the transformation settling into comfortable proportions."); } } else if (!oldIsPenis && !newIsPenis) { // Vagina tightness change if (newType === "tight vagina") { texts.push("A pleasant tightening sensation runs through your core as your vagina becomes tighter, the walls becoming more snug."); } else if (newType === "loose vagina") { texts.push("You feel your vagina relaxing and loosening, the internal muscles becoming more accommodating."); } else { texts.push("Your vagina shifts to an average tightness, finding a comfortable middle ground."); } } else if (oldIsPenis && !newIsPenis) { // Penis to vagina texts.push("An overwhelming sensation courses through your entire body as your penis begins to shrink inward. The transformation is profound and unmistakable - flesh reshaping, nerves rewiring. When it's complete, you have a vagina where your penis once was."); texts.push("You feel an intense pressure as your masculine genitals reshape themselves completely. The change is total and irreversible, leaving you with feminine anatomy in place of your former penis."); } else { // Vagina to penis texts.push("An overwhelming sensation courses through your entire body as new flesh begins to form and extend outward from your core. The transformation is profound and unmistakable - internal becoming external, nerves rewiring. When it's complete, you have a penis where your vagina once was."); texts.push("You feel an intense pressure as your feminine genitals reshape themselves completely. The change is total and irreversible, leaving you with masculine anatomy in place of your former vagina."); } return texts[Math.floor(Math.random() * texts.length)]; }>>
/* ---------------------------------- */ /* --- MONEY SYSTEM FUNCTIONS --- */ /* ---------------------------------- */ /* Format money display */ <<set setup.formatMoney = function(amount) { return "$" + amount.toLocaleString(); }>> /* Add money to player */ <<set setup.addMoney = function(amount) { var v = State.variables; amount = Number(amount); if (!Number.isNaN(amount) && amount > 0) { v.money += amount; return true; } return false; }>> /* Remove money from player */ <<set setup.removeMoney = function(amount) { var v = State.variables; amount = Number(amount); if (!Number.isNaN(amount) && amount > 0 && v.money >= amount) { v.money -= amount; return true; } return false; }>> /* Check if player can afford something */ <<set setup.canAfford = function(amount) { var v = State.variables; amount = Number(amount); return !Number.isNaN(amount) && v.money >= amount; }>>
/* ---------------------------------- */ /* --- NPC DIALOGUE SYSTEM --- */ /* ---------------------------------- */ <<set setup.getNPCGreeting = function(npc, relLevel) { var v = State.variables; var greetings = []; // Base greeting on relationship level AND personality if (relLevel === 0) { // Stranger greetings - personality driven if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { greetings.push("What? Can't you see I'm busy?"); greetings.push("Do I know you? No? Then why are you talking to me?"); greetings.push("*sighs* What do you want?"); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { greetings.push("Oh... um, hi. Can I... help you with something?"); greetings.push("H-hello there..."); greetings.push("Um... yes?"); } else if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Diva")) { greetings.push("Yes? Make it quick, I have places to be."); greetings.push("You have my attention. For now."); greetings.push("I don't believe we've been introduced. You are...?"); } else if (npc.mentalTraits.includes("Cold") || npc.mentalTraits.includes("Cynical")) { greetings.push("Yeah? What is it?"); greetings.push("Something you need?"); greetings.push("I'm listening."); } else if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Warm")) { greetings.push("Oh, hi there! I don't think we've met. I'm " + npc.name + "!"); greetings.push("Hey! New face around here? Nice to meet you!"); greetings.push("Hello! How can I help you today?"); } else { greetings.push("Hi there. Something I can do for you?"); greetings.push("Yeah? Can I help you with something?"); greetings.push("Oh, it's you. What's up?"); } } else if (relLevel === 1) { // Acquaintance greetings if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Outgoing")) { greetings.push("Hey! Good to see you again! How've you been?"); greetings.push("Oh hey! What brings you by today?"); greetings.push("There you are! Was just thinking about you the other day."); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { greetings.push("Oh, hi again... nice to see you..."); greetings.push("Hey... um, how are things?"); greetings.push("*waves nervously* Hi there..."); } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { greetings.push("Oh hey, what's up?"); greetings.push("Yo. How's it going?"); greetings.push("Sup. Need something?"); } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Cynical")) { greetings.push("Oh. You again. What now?"); greetings.push("Back already? This should be interesting."); greetings.push("*looks up* Yeah?"); } else { greetings.push("Hey! Good to see you again."); greetings.push("Oh hey, what's up?"); greetings.push("Nice to see a familiar face."); } } else if (relLevel === 2) { // Friend greetings if (npc.mentalTraits.includes("Warm") || npc.mentalTraits.includes("Friendly")) { greetings.push("Hey friend! I'm so glad you stopped by! How have you been?"); greetings.push("There's my favorite person! Come here, tell me everything!"); greetings.push("Perfect timing! I was hoping I'd see you today!"); } else if (npc.mentalTraits.includes("Excited") || npc.mentalTraits.includes("Energetic")) { greetings.push("Omg hey!! How are you?! I have so much to tell you!"); greetings.push("YES! You're here! Okay so you won't believe what happened!"); greetings.push("Hey hey hey! Finally! I've been dying to talk to you!"); } else if (npc.mentalTraits.includes("Calm") || npc.mentalTraits.includes("Chill")) { greetings.push("Hey there. Always good to see you."); greetings.push("What's up, friend? How's life treating you?"); greetings.push("Good to see you. Want to hang out for a bit?"); } else if (npc.mentalTraits.includes("Shy")) { greetings.push("Oh! Hi! I'm... I'm really happy you're here..."); greetings.push("*smiles warmly* Hey... I was hoping you'd come by..."); greetings.push("You came! That makes me really happy..."); } else { greetings.push("Hey friend! How have you been?"); greetings.push("Always happy to see you!"); greetings.push("There you are! I was hoping you'd stop by."); } } else { // Best friend/Close friend greetings if (npc.mentalTraits.includes("Warm") || npc.mentalTraits.includes("Loyal")) { greetings.push("There's my best friend! I've missed you so much! Come sit, we have catching up to do!"); greetings.push("You! Oh my god, finally! I always feel better when you're around!"); greetings.push("Hey you! You know you can always brighten my day just by showing up, right?"); } else if (npc.mentalTraits.includes("Excited") || npc.mentalTraits.includes("Energetic")) { greetings.push("THERE YOU ARE!! I have been WAITING for you! So much to talk about!!"); greetings.push("Finally!! Okay okay, sit down, you NEED to hear this!"); greetings.push("YES! My favorite person in the whole city! Get over here!"); } else if (npc.mentalTraits.includes("Chill") || npc.mentalTraits.includes("Calm")) { greetings.push("Hey bestie. You know I'm always glad when you show up."); greetings.push("There's my person. What's new with you?"); greetings.push("Perfect timing as always. Want to chill for a bit?"); } else if (npc.mentalTraits.includes("Cynical")) { greetings.push("Well well, if it isn't my favorite person. One of the few people in this city worth talking to."); greetings.push("You're here. Good. At least now I have someone interesting to talk to."); greetings.push("Finally, someone with a brain. How are you?"); } else { greetings.push("My dear friend! It's wonderful to see you!"); greetings.push("You! I'm so glad you're here!"); greetings.push("If it isn't my favorite person! Come, sit with me."); } } var baseGreeting = greetings[Math.floor(Math.random() * greetings.length)]; // Add reactions based on player's physical traits and NPC personality var reactions = []; // React to attractive/ugly based on personality if (v.physicalTraits.includes("Attractive") && relLevel >= 1) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { reactions.push(" Looking good today... like always."); reactions.push(" Damn, you look fine."); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { reactions.push(" You... you look really nice today..."); } else if (!npc.mentalTraits.includes("Cold") && !npc.mentalTraits.includes("Insensitive")) { reactions.push(" You're looking good today."); } } else if (v.physicalTraits.includes("Ugly")) { if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { if (relLevel === 0) { reactions.push(" ...Rough day?"); reactions.push(" Yikes."); } } else if (npc.mentalTraits.includes("Insensitive") || npc.mentalTraits.includes("Blunt")) { reactions.push(" You uh... you alright? You look tired."); } } // React to muscular based on NPC's own physique if (v.physicalTraits.includes("Muscular") && npc.physicalTraits.includes("Muscular") && relLevel >= 1) { if (npc.mentalTraits.includes("Competitive")) { reactions.push(" Been hitting the gym hard, I see. Trying to catch up to me?"); } else if (npc.mentalTraits.includes("Jock")) { reactions.push(" Looking swole! Keep up the gains, bro!"); } else { reactions.push(" Been hitting the gym, I see. Nice work."); } } // React to curvy/voluptuous if ((v.physicalTraits.includes("Curvy") || v.physicalTraits.includes("Voluptuous"))) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { reactions.push(" Those curves though... damn."); reactions.push(" Looking like a whole meal, as always."); } else if (npc.jobs.includes("Brothel Worker") && relLevel >= 2) { reactions.push(" You've got that body that makes heads turn everywhere."); } } // React to fashionable if (v.physicalTraits.includes("Fashionable")) { if (npc.mentalTraits.includes("Prep") || npc.mentalTraits.includes("Diva") || npc.physicalTraits.includes("Fashionable")) { reactions.push(" Love the outfit! You've got great style!"); } else if (npc.mentalTraits.includes("Goth") && v.physicalTraits.includes("Tattooed")) { reactions.push(" Digging the look."); } } // React to shared job if (v.jobs.length > 0 && npc.jobs.includes(v.jobs[0]) && relLevel >= 1) { if (npc.mentalTraits.includes("Workaholic") || npc.mentalTraits.includes("Hardworking")) { reactions.push(" How's work been treating you? Staying busy?"); } else if (npc.mentalTraits.includes("Lazy")) { reactions.push(" Another day at the grind, huh? Ugh."); } else { reactions.push(" How's work been?"); } } // React to player being well-dressed and NPC being prep/diva if (v.mentalTraits.includes("Prep") && npc.mentalTraits.includes("Prep") && relLevel >= 1) { reactions.push(" You're looking very put-together today. I appreciate that."); } // React to shared stereotypes if (v.mentalTraits.includes("Nerd") && npc.mentalTraits.includes("Nerd") && relLevel >= 1) { reactions.push(" Hey, did you see that new tech release?"); } if (v.mentalTraits.includes("Goth") && npc.mentalTraits.includes("Goth") && relLevel >= 1) { reactions.push(" Dark aesthetic today. I respect it."); } if (reactions.length > 0) { baseGreeting += reactions[Math.floor(Math.random() * reactions.length)]; } return baseGreeting; }>> <<set setup.getNPCResponse = function(npc, topic, relLevel) { var v = State.variables; var prefs = setup.getNPCPreferences(npc.name); var responses = []; if (topic === "job") { var job = npc.jobs.length > 0 ? npc.jobs[0] : "Unemployed"; if (job === "Unemployed") { if (npc.mentalTraits.includes("Lazy")) { responses.push("Job? Nah, I'm good. Work is overrated anyway. Why slave away when you can just... not? Life's too short for all that stress."); } else if (npc.mentalTraits.includes("Ambitious")) { responses.push("Between jobs right now. I'm looking for the right opportunity, something that matches my potential. I'm not going to settle for just anything - I have goals, you know?"); } else if (npc.mentalTraits.includes("Anxious") || npc.mentalTraits.includes("Insecure")) { responses.push("I... I've been trying to find work. It's tough out there. The rejections are... *sighs* they really get to you after a while. I'm trying to stay positive but..."); } else if (npc.mentalTraits.includes("Depressed") || npc.mentalTraits.includes("Pessimistic")) { responses.push("Not working at the moment. The job market is terrible, and honestly, does any of it even matter? We work to live, live to work... it's all a cycle."); } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { responses.push("Not working right now. Taking some time to figure things out, you know? No rush."); } else { responses.push("I'm... currently between opportunities. Looking for work, you know? Something will turn up eventually."); } } else { var jobResponse = ""; // Opening based on personality if (npc.mentalTraits.includes("Hardworking") || npc.mentalTraits.includes("Workaholic")) { jobResponse = "I work as a " + job + ". Long hours, demanding work, but I take pride in what I do. Hard work pays off, you know? I'm usually the first one in and the last one out. That's just how I operate."; } else if (npc.mentalTraits.includes("Lazy") || npc.mentalTraits.includes("Unmotivated")) { jobResponse = "Technically I'm a " + job + ". It's a paycheck, that's all I really care about. I do the bare minimum to get by. Why stress myself out for a job that doesn't care about me anyway?"; } else if (npc.mentalTraits.includes("Ambitious") || npc.mentalTraits.includes("Determined")) { jobResponse = "I'm a " + job + " right now, but it's just a stepping stone. I've got bigger plans. Way bigger. I'm not staying in this position forever - I'm going places."; } else if (npc.mentalTraits.includes("Passionate") || npc.mentalTraits.includes("Enthusiastic")) { jobResponse = "I'm a " + job + " and I absolutely love it! Every day is exciting. I wake up looking forward to getting to work. Not everyone can say that about their job, right?"; } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Cynical")) { jobResponse = "Ugh, I'm stuck being a " + job + ". It's not great, but what choice do I have? Bills don't pay themselves. The people are annoying, the pay could be better, but whatever. It is what it is."; } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Anxious")) { jobResponse = "I, um, work as a " + job + ". It's... it's okay. Sometimes stressful, but I manage. The people are mostly nice... I think..."; } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Arrogant")) { jobResponse = "I'm a " + job + ", and I'm damn good at it. Probably one of the best, actually. I know my worth and I make sure everyone else knows it too."; } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { jobResponse = "I work as a " + job + ". It's alright, you know? Keeps me busy, pays the bills. Can't really complain."; } else { jobResponse = "I work as a " + job + ". It's decent work, pays the bills. Can't complain too much."; } // Add job-specific flavor based on actual job if (job === "Brothel Worker" || job === "Prostitute" || job === "Hooker") { if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Seductive")) { jobResponse += " I'm good at what I do, and the money's great. Plus, I meet interesting people."; } else if (npc.mentalTraits.includes("Shy")) { jobResponse += " It... it's not what I thought I'd be doing, but the money helps..."; } else if (npc.mentalTraits.includes("Practical") || npc.mentalTraits.includes("Pragmatic")) { jobResponse += " It pays well, that's what matters. People can judge all they want."; } } else if (job === "Stripper") { if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Flirty")) { jobResponse += " The stage is my home. I love performing, feeling all eyes on me."; } else if (npc.mentalTraits.includes("Ambitious")) { jobResponse += " It's temporary. I'm building up my savings for bigger things."; } } else if (job === "Construction Worker" || job === "Dock Worker") { if (npc.mentalTraits.includes("Jock") || npc.mentalTraits.includes("Strong")) { jobResponse += " It's hard physical work, but that's what I'm built for. Keeps me in shape too."; } else if (npc.mentalTraits.includes("Hardworking")) { jobResponse += " Honest work for honest pay. That's all I need."; } } else if (job.includes("Clerk") || job.includes("Salon")) { if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Outgoing")) { jobResponse += " I love interacting with customers. Meeting new people every day is the best part."; } else if (npc.mentalTraits.includes("Tired") || npc.mentalTraits.includes("Frustrated")) { jobResponse += " Dealing with customers all day can be exhausting though. People can be so demanding."; } } else if (job === "City Mayor" || job === "Mayor's Secretary") { if (npc.mentalTraits.includes("Ambitious") || npc.mentalTraits.includes("Arrogant")) { jobResponse += " I have real power here. I shape this city's future."; } else if (npc.mentalTraits.includes("Stressed") || npc.mentalTraits.includes("Overworked")) { jobResponse += " The responsibility is immense. Everyone wants something from you in this position."; } } // Add comment about player's job if they share it if (v.jobs.length > 0 && v.jobs[0] === job) { if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Warm")) { jobResponse += " Hey, you work there too, right? That's awesome! How are you finding it? We should swap stories sometime."; } else if (npc.mentalTraits.includes("Competitive")) { jobResponse += " Oh, you work there too? Interesting. May the best worker win."; } else if (npc.mentalTraits.includes("Nonchalant")) { jobResponse += " Oh yeah, you're there too. Cool."; } else { jobResponse += " Hey, you work there too, right? How are you finding it?"; } } responses.push(jobResponse); } } else if (topic === "opinion") { var opinions = []; // React to player's physical appearance with personality filters if (v.physicalTraits.includes("Attractive")) { if (relLevel >= 2) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { opinions.push(`You? You're gorgeous, honestly. Like seriously stunning. I could look at you all day`); } else if (npc.mentalTraits.includes("Shy")) { opinions.push(`You're... you're really attractive. I hope that's okay to say...`); } else if (npc.mentalTraits.includes("Direct") || npc.mentalTraits.includes("Blunt")) { opinions.push(`You're good-looking. That's just a fact`); } else { opinions.push(`You? You're gorgeous, honestly`); } } else { if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { opinions.push(`You... you look nice`); } else { opinions.push(`You look... nice`); } } } else if (v.physicalTraits.includes("Ugly")) { if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Warm")) { opinions.push(`You have a nice personality. That's what really matters in the end, you know?`); } else if (npc.mentalTraits.includes("Blunt") || npc.mentalTraits.includes("Insensitive")) { if (relLevel === 0) { opinions.push(`You want my honest opinion? ...Maybe work on your appearance a bit. I'm just being real with you`); } } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { if (relLevel === 0) { opinions.push(`Honestly? You could use some work. But hey, at least you asked`); } } } // React to shared traits with personality if (v.physicalTraits.includes("Muscular") && npc.physicalTraits.includes("Muscular")) { if (npc.mentalTraits.includes("Competitive")) { opinions.push(`I respect the muscle, even if I'm clearly more built. You put in work though`); } else if (npc.mentalTraits.includes("Jock")) { opinions.push(`Bro! The gains are real! Respect! You clearly put in the work at the gym`); } else { opinions.push(`I respect the muscle. You clearly put in the work`); } } // React to fashionable if (v.physicalTraits.includes("Fashionable")) { if (npc.physicalTraits.includes("Fashionable") || npc.mentalTraits.includes("Prep")) { opinions.push(`Your fashion sense? Immaculate. You clearly care about your appearance and it shows`); } else if (npc.mentalTraits.includes("Goth")) { opinions.push(`I see you've got your own style. I can respect that`); } } // React to body types if (v.physicalTraits.includes("Curvy") || v.physicalTraits.includes("Voluptuous")) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { opinions.push(`Your curves? Absolutely stunning. You must turn heads everywhere you go. I know I'm looking`); } else if (npc.mentalTraits.includes("Jealous") && npc.physicalTraits.includes("Flat")) { opinions.push(`You've got... quite the figure. Lucky you`); } else { opinions.push(`You've got a great figure`); } } // React to personality matches if (v.mentalTraits.includes("Kind") && npc.mentalTraits.includes("Kind")) { opinions.push(`You're one of the genuinely good people in this city. I really appreciate that about you. We need more people like you around here`); } if (v.mentalTraits.includes("Ambitious") && npc.mentalTraits.includes("Ambitious")) { opinions.push(`I like your drive and determination. You're going places, I can tell. People like us, we don't stop until we get what we want`); } if (v.mentalTraits.includes("Nerd") && npc.mentalTraits.includes("Nerd")) { opinions.push(`You actually understand what I'm talking about when I get technical. That's... rare. It's refreshing`); } if (v.mentalTraits.includes("Goth") && npc.mentalTraits.includes("Goth")) { opinions.push(`You get the aesthetic. Most people don't understand it, but you do`); } if (v.mentalTraits.includes("Jock") && npc.mentalTraits.includes("Jock")) { opinions.push(`You're athletic and competitive. I respect that. We should work out together sometime`); } if (v.mentalTraits.includes("Bitchy") && !npc.mentalTraits.includes("Patient") && !npc.mentalTraits.includes("Kind")) { opinions.push(`You can be pretty abrasive sometimes, not gonna lie. But at least you're real about it`); } // React to job matches/differences if (v.jobs.length > 0 && npc.jobs.length > 0) { if (v.jobs[0] === npc.jobs[0]) { if (npc.mentalTraits.includes("Friendly")) { opinions.push(`Fellow ${v.jobs[0]}! It's nice having someone who actually gets what the job is like. We should share war stories`); } else if (npc.mentalTraits.includes("Competitive")) { opinions.push(`So we're both ${v.jobs[0]}s. May the best one succeed`); } else { opinions.push(`Fellow ${v.jobs[0]}! It's nice having someone who gets the job`); } } } // Relationship-based closing if (opinions.length > 0) { var response = opinions[Math.floor(Math.random() * opinions.length)] + ". "; if (relLevel >= 3) { if (npc.mentalTraits.includes("Warm") || npc.mentalTraits.includes("Loyal")) { response += `Overall? I think you're pretty amazing. One of the best people I know, honestly.`; } else if (npc.mentalTraits.includes("Chill") || npc.mentalTraits.includes("Nonchalant")) { response += `You're cool. That's about it.`; } else { response += `Overall? I think you're pretty amazing.`; } } else if (relLevel >= 2) { if (npc.mentalTraits.includes("Friendly")) { response += `You're good people. I'm glad we're friends.`; } else { response += `You're good people.`; } } else { response += `That's my honest take.`; } responses.push(response); } else { if (relLevel >= 3) { if (npc.mentalTraits.includes("Warm")) { responses.push(`What do I think? I think you're wonderful. One of my favorite people, honestly. I'm really glad we met.`); } else { responses.push(`What do I think? I think you're wonderful. One of my favorite people, honestly.`); } } else if (relLevel >= 2) { responses.push(`You're cool. I like hanging out with you. We should do it more often.`); } else { responses.push(`We haven't talked enough for me to have a strong opinion yet. You seem okay though.`); } } } else if (topic === "smalltalk") { if (npc.mentalTraits.includes("Talkative") || npc.mentalTraits.includes("Outgoing") || npc.mentalTraits.includes("Energetic")) { responses.push("Oh man, you know what I was thinking about the other day? The weather's been absolutely crazy lately! Like, one day it's hot, next day it's cold - make up your mind, nature! But hey, that's Sunfish City for you! Never a dull moment in this place!"); } else if (npc.mentalTraits.includes("Introverted") || npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Quiet")) { responses.push("Um... yeah, things are... fine. Weather's been okay. So... yeah. *awkward silence*"); } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude") || npc.mentalTraits.includes("Impatient")) { responses.push("Small talk? Really? Fine. Yes, the weather exists. The city is still standing. Congratulations on stating the obvious. There, happy?"); } else if (npc.mentalTraits.includes("Nerd") || npc.mentalTraits.includes("Intelligent")) { responses.push("Did you hear about the new development project in the business district? Fascinating urban planning implications. The way they're redesigning the traffic flow could reduce congestion by up to 30%. I could talk about city infrastructure for hours if you're interested."); } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { responses.push("Yeah, things have been pretty normal. Same routine, you know? Can't complain. Life's just... happening."); } else if (npc.mentalTraits.includes("Goth") || npc.mentalTraits.includes("Cynical")) { responses.push("Small talk. The ultimate display of social conformity. We talk about meaningless things to avoid the void of existence. But sure, the weather's fine, I guess."); } else if (npc.mentalTraits.includes("Jock")) { responses.push("Bro, did you catch the game last night? That final play was INSANE! Also hit a new PR at the gym yesterday. Things are going pretty good!"); } else if (npc.mentalTraits.includes("Prep") || npc.mentalTraits.includes("Fashionable")) { responses.push("Oh, things have been fabulous! Did you see the new collection that just dropped downtown? I'm thinking about picking up a few pieces. Fashion waits for no one!"); } else { responses.push("Yeah, things have been pretty normal. Same old routine, you know? How about you? Anything interesting going on?"); } } else if (topic === "insult") { if (npc.mentalTraits.includes("Aggressive") || npc.mentalTraits.includes("Short Tempered") || npc.mentalTraits.includes("Violent")) { responses.push("Excuse me? You want to say that again? Get the hell out of my face RIGHT NOW before I make you regret it. I'm not playing around. Try me and see what happens."); } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { responses.push("Oh, that's rich coming from YOU. You've got some nerve. Get out of my sight before I really let you have it."); } else if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Patient") || npc.mentalTraits.includes("Sensitive")) { responses.push("That... that really hurt. I don't know what I did to deserve that, but... *tears up* I think you should just go. Please."); } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Arrogant")) { responses.push("Wow, really? That's the best you've got? I've heard worse from better people. You're going to have to try a LOT harder than that to actually hurt my feelings. Try harder next time."); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Insecure")) { responses.push("What? Why would you... *voice shaking* That's really mean... I... I need you to leave. Please. Just... just go..."); } else if (npc.mentalTraits.includes("Cold") || npc.mentalTraits.includes("Emotionless")) { responses.push("...Is that all? Are you done? Okay. Leave."); } else if (npc.mentalTraits.includes("Sarcastic") || npc.mentalTraits.includes("Witty")) { responses.push("Oh wow, what a devastating insult. I'm so hurt. Really. Can't you tell how wounded I am? Please, spare me your brilliant wit."); } else { responses.push("What the hell? Why would you say that? Just... just leave me alone. Seriously."); } } else if (topic === "compliment") { if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Insecure")) { responses.push("Oh... um... thank you. That's... that's really nice of you to say..."); responses.push("Really? You think so? That... that means a lot..."); } else if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Vain")) { responses.push("Well, obviously. But it's nice to hear you recognize it."); responses.push("I know. But thanks for noticing."); } else if (npc.mentalTraits.includes("Confident")) { responses.push("Hey, thanks! I appreciate that!"); responses.push("That's kind of you to say. Thank you!"); } else if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Warm")) { responses.push("Aww, that's so sweet of you! Thank you so much!"); responses.push("You're so kind! That really made my day!"); } else { responses.push("Oh, thank you. That's nice of you to say."); responses.push("I appreciate that. Thanks."); } } else if (topic === "trading" && prefs) { var mentions = []; if (prefs.desires && relLevel >= 1) { if (prefs.desires.skills && prefs.desires.skills.length > 0) { mentions.push("I've been wanting to learn " + prefs.desires.skills[0]); } if (prefs.desires.mental && prefs.desires.mental.length > 0) { mentions.push("I wish I could be more " + prefs.desires.mental[0].toLowerCase()); } } if (mentions.length > 0) { var mainMention = mentions[Math.floor(Math.random() * mentions.length)]; if (npc.mentalTraits.includes("Honest") || npc.mentalTraits.includes("Direct")) { responses.push("Well, to be honest, " + mainMention + ". But I'm open to hearing offers!"); } else if (npc.mentalTraits.includes("Shrewd")) { responses.push("Hmm, let's just say " + mainMention + ". But everything has a price, doesn't it?"); } else { responses.push("Trading? Sure. " + mainMention.charAt(0).toUpperCase() + mainMention.slice(1) + "."); } } else { responses.push("I'm open to trading, depends on what you're offering."); } } // Default fallback if (responses.length === 0) { if (npc.mentalTraits.includes("Thoughtful") || npc.mentalTraits.includes("Analytical")) { responses.push("Hmm, interesting question. I'll have to think about that for a while."); } else if (npc.mentalTraits.includes("Nonchalant")) { responses.push("Sure, whatever."); } else { responses.push("Hmm, interesting. I'll have to think about that."); } } return responses[Math.floor(Math.random() * responses.length)]; }>> <<set setup.calculateTalkRelationshipChange = function(npc, topic, relLevel) { var change = 0; }>> /* Function to add relationship bonus from trading */ <<set setup.addTradeRelationshipBonus = function(npc, playerPackage, npcPackage) { var v = State.variables; var prefs = setup.getNPCPreferences(npc); if (!prefs) { return 0; } var pointsGain = 0; // Check if player gave desired traits (+5 points per desired item) if (prefs.desires) { if (prefs.desires.skills && playerPackage.skills) { playerPackage.skills.forEach(function(skill) { if (prefs.desires.skills.includes(skill)) { pointsGain += 5; } }); } if (prefs.desires.mental && playerPackage.mental) { playerPackage.mental.forEach(function(trait) { if (prefs.desires.mental.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.physical && playerPackage.physical) { playerPackage.physical.forEach(function(trait) { if (prefs.desires.physical.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.bodyParts && playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (prefs.desires.bodyParts.includes(part.name)) { pointsGain += 5; } }); } } // Check if player took reluctant traits (-1 point per reluctant item) if (prefs.reluctantToTrade && npcPackage) { if (prefs.reluctantToTrade.skills && npcPackage.skills) { npcPackage.skills.forEach(function(skill) { if (prefs.reluctantToTrade.skills.includes(skill)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.mental && npcPackage.mental) { npcPackage.mental.forEach(function(trait) { if (prefs.reluctantToTrade.mental.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.physical && npcPackage.physical) { npcPackage.physical.forEach(function(trait) { if (prefs.reluctantToTrade.physical.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.bodyParts && npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (prefs.reluctantToTrade.bodyParts.includes(part.name)) { pointsGain -= 1; } }); } } return pointsGain; }>> <<set setup.calculateTalkRelationshipChange = function(npc, topic, relLevel) { var change = 0; if (topic === "compliment") { // Compliments - modified by personality if (npc.mentalTraits.includes("Insecure") || npc.mentalTraits.includes("Shy")) { change = relLevel >= 3 ? 3 : 2; // Extra impact on insecure people (Friend+) } else if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Vain")) { change = 1; // They expect compliments } else { change = relLevel >= 3 ? 2 : 1; // Friend+ } } else if (topic === "insult") { // Insults - personality determines severity if (npc.mentalTraits.includes("Sensitive") || npc.mentalTraits.includes("Insecure")) { change = relLevel === 1 ? -5 : (relLevel === 2 ? -4 : -2); // Stranger, Acquaintance, Friend+ } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Arrogant")) { change = relLevel === 1 ? -2 : (relLevel === 2 ? -1 : -1); // Less impact if confident } else if (npc.mentalTraits.includes("Aggressive") || npc.mentalTraits.includes("Short Tempered")) { change = -4; // They don't forgive easily } else { change = relLevel === 1 ? -3 : (relLevel === 2 ? -2 : -1); } } else if (topic === "opinion") { // Asking opinion - modified by personality if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Vain")) { change = relLevel === 1 ? 2 : 1; // They LOVE talking about themselves at Stranger level } else if (npc.mentalTraits.includes("Shy")) { change = relLevel === 1 ? 0 : 1; // Uncomfortable at Stranger level } else { change = relLevel === 1 ? 1 : 0; // Stranger gives +1, higher levels give 0 } } else if (topic === "trading") { // Trading interest - modified by personality if (npc.mentalTraits.includes("Greedy") || npc.mentalTraits.includes("Shrewd")) { change = 1; // They like business talk } else if (npc.mentalTraits.includes("Generous")) { change = relLevel === 1 ? 1 : 0; // Stranger gives +1 } else { change = relLevel === 1 ? 1 : 0; // Stranger gives +1 } } else if (topic === "smalltalk") { // Small talk - personality heavily influences if (npc.mentalTraits.includes("Talkative") || npc.mentalTraits.includes("Friendly")) { change = 1; // They enjoy it } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Impatient")) { change = -1; // They hate it } else { change = 0; // Neutral } } else if (topic === "job") { // Job talk doesn't change relationship change = 0; } else { // Default fallback for unknown topics change = 0; } return change; }>> /* Function to add relationship bonus from trading */ <<set setup.addTradeRelationshipBonus = function(npc, playerPackage, npcPackage) { var v = State.variables; var prefs = setup.getNPCPreferences(npc); if (!prefs) { return 0; } var pointsGain = 0; // Check if player gave desired traits (+5 points per desired item) if (prefs.desires) { if (prefs.desires.skills && playerPackage.skills) { playerPackage.skills.forEach(function(skill) { if (prefs.desires.skills.includes(skill)) { pointsGain += 5; } }); } if (prefs.desires.mental && playerPackage.mental) { playerPackage.mental.forEach(function(trait) { if (prefs.desires.mental.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.physical && playerPackage.physical) { playerPackage.physical.forEach(function(trait) { if (prefs.desires.physical.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.bodyParts && playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (prefs.desires.bodyParts.includes(part.name)) { pointsGain += 5; } }); } } // Check if player took reluctant traits (-1 point per reluctant item) if (prefs.reluctantToTrade && npcPackage) { if (prefs.reluctantToTrade.skills && npcPackage.skills) { npcPackage.skills.forEach(function(skill) { if (prefs.reluctantToTrade.skills.includes(skill)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.mental && npcPackage.mental) { npcPackage.mental.forEach(function(trait) { if (prefs.reluctantToTrade.mental.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.physical && npcPackage.physical) { npcPackage.physical.forEach(function(trait) { if (prefs.reluctantToTrade.physical.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.bodyParts && npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (prefs.reluctantToTrade.bodyParts.includes(part.name)) { pointsGain -= 1; } }); } } return pointsGain; }>>
/* ---------------------------------- */ /* --- JOB WORK BONUS/PENALTY SYSTEM --- */ /* ---------------------------------- */ <<set setup.jobWorkConfig = { "Fitness Shop Clerk": { statRequirement: {stat: "strength", value: 25}, possibleGains: ["Fit", "Confident", "Patient", "Sales", "Retail", "Chill"], bonuses: { small: ["Fit", "Flexible", "Broad-shouldered", "Sturdy", "Tall", "Optimistic", "Patient", "Sales"], medium: ["Attractive", "Athletic Build", "Extroverted", "Heavy Lifting", "Athletics", "Yoga"], big: ["Muscular", "Friendly", "Outgoing", "Energetic", "Chill"] }, negativeRemovable: ["Ugly", "Overweight", "Underweight", "Weak", "Soft"], negativeReplacements: { "Overweight": "Fit", "Underweight": "Fit", "Weak": "Strong" }, traitUpgrades: { "Strong": "Muscular" }, negativePermanent: ["Messy Hair"] }, "Adult Store Clerk": { statRequirement: {stat: "charisma", value: 20}, possibleGains: ["Patient", "Sales", "Retail", "Chill"], bonuses: { small: ["Optimistic", "Patient", "Outgoing", "Energetic", "Accounting"], medium: ["Attractive", "Creative", "Huge Chest", "Curvy", "Voluptuous", "Huge Butt", "Giant Butt"], big: ["Friendly", "Sexually Skilled", "Sales", "Giant Chest", "Chill"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: {}, negativePermanent: ["Messy Hair"] }, "Ecentric Shop Worker": { statRequirement: {stat: "charisma", value: 20}, possibleGains: ["Patient", "Sales", "Sarcastic", "Artistic", "Retail", "Chill", "Humorous"], bonuses: { small: ["Dominant", "Creative", "Patient", "Accounting", "Deep Thinker", "Sarcastic", "Humorous", "Black Hair"], medium: ["Attractive", "Optimistic", "Honest", "Pierced", "Artistic", "Relaxed"], big: ["Introverted", "Pessimistic", "Sales", "Monotone Expression", "Retail", "Chill"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: { "Relaxed": "Chill" }, negativePermanent: ["Messy Hair"] }, "Dock Worker": { statRequirement: {stat: "strength", value: 15}, possibleGains: ["Patient", "Forklift Certified", "Relaxed", "Humorous"], bonuses: { small: ["Friendly", "Outgoing", "Energetic", "Relaxed"], medium: ["Attractive", "Optimistic", "Patient", "Honest", "Chill", "Humorous"], big: ["Hardworking", "Muscular", "Forklift Certified"] }, negativeRemovable: ["Ugly", "Impatient"], negativeReplacements: { "Impatient": "Patient" }, traitUpgrades: { "Relaxed": "Chill" }, negativePermanent: [] }, "Tech Store Clerk": { statRequirement: {stat: "intelligence", value: 20}, possibleGains: ["Confident", "Patient", "Intelligent", "Analytical", "Persuasion", "Sales", "Tech-Savvy", "Troubleshooting"], bonuses: { small: ["Outgoing", "Introverted", "Deep Thinker"], medium: ["Attractive", "Optimistic", "Creative", "Patient", "Persuasion", "Sales", "Accounting", "Retail"], big: ["Friendly", "Logical", "Intelligent", "Analytical", "Tech-Savvy", "Troubleshooting"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: {}, negativePermanent: ["Messy Hair"] }, "Beauty Salon Stylist": { statRequirement: {stat: "dexterity", value: 30}, possibleGains: ["Confident", "Optimistic", "Patient", "Outgoing", "Makeup", "Hair Styling", "Cleaning"], bonuses: { small: ["Hardworking", "Creative", "Energetic", "Cleaning", "Retail"], medium: ["Attractive", "Optimistic", "Makeup"], big: ["Extroverted", "Friendly", "Patient", "Outgoing", "Hair Styling"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: {}, negativePermanent: ["Messy Hair"] } }>> /* Helper function to check if player has any trait/skill */ <<set setup.playerHasTrait = function(traitName) { var v = State.variables; // Check body parts for special cases if (traitName === "Black Hair") { return v.hairColor === "Black"; } if (traitName === "Messy Hair") { return v.hairLength === "Messy Hair"; } // Check chest/butt sizes var sizeTraits = ["Huge Chest", "Giant Chest", "Huge Butt", "Giant Butt"]; if (sizeTraits.includes(traitName)) { var bodyPart = traitName.includes("Chest") ? "chest" : "butt"; var size = traitName.split(" ")[0].toLowerCase(); // "huge" or "giant" return v[bodyPart] && v[bodyPart].toLowerCase() === size; } return v.physicalTraits.includes(traitName) || v.mentalTraits.includes(traitName) || v.skills.includes(traitName); }>> /* Calculate pay multiplier based on stat deficit */ <<set setup.getJobPayMultiplier = function(jobName) { var v = State.variables; var config = setup.jobWorkConfig[jobName]; if (!config || !config.statRequirement) { return 1.0; // No penalty if job not in system } var requiredStat = config.statRequirement.stat; var requiredValue = config.statRequirement.value; var playerStat = setup.getTotalStat(requiredStat); // Use total stat with bonuses // If player meets or exceeds requirement, full pay (100%) if (playerStat >= requiredValue) { return 1.0; } // Calculate how far below the requirement the player is // Formula: (playerStat / requiredValue) gives us the percentage // This naturally scales: // - If you have 6/15 strength = 40% pay (60% penalty) // - If you have 5/70 charisma = 7.14% pay (92.86% penalty) // - If you have 0 stats = 0% pay (100% penalty) var multiplier = playerStat / requiredValue; // Ensure minimum is 0 (can't go negative) if (multiplier < 0) multiplier = 0; return multiplier; }>> /* Calculate bonus pay from traits */ <<set setup.getJobBonusMultiplier = function(jobName) { var config = setup.jobWorkConfig[jobName]; if (!config) return 0; var bonusPercent = 0; // Check small bonuses (2% each) for (var i = 0; i < config.bonuses.small.length; i++) { if (setup.playerHasTrait(config.bonuses.small[i])) { bonusPercent += 2; } } // Check medium bonuses (5% each) for (var i = 0; i < config.bonuses.medium.length; i++) { if (setup.playerHasTrait(config.bonuses.medium[i])) { bonusPercent += 5; } } // Check big bonuses (15% each) for (var i = 0; i < config.bonuses.big.length; i++) { if (setup.playerHasTrait(config.bonuses.big[i])) { bonusPercent += 15; } } return bonusPercent / 100; // Convert to multiplier }>> /* Calculate penalty from negative traits */ <<set setup.getJobNegativePenalty = function(jobName) { var config = setup.jobWorkConfig[jobName]; if (!config) return 0; var penaltyPercent = 0; // Check removable negatives (10% penalty each) for (var i = 0; i < config.negativeRemovable.length; i++) { if (setup.playerHasTrait(config.negativeRemovable[i])) { penaltyPercent += 10; } } // Check permanent negatives (5% penalty each) for (var i = 0; i < config.negativePermanent.length; i++) { if (setup.playerHasTrait(config.negativePermanent[i])) { penaltyPercent += 5; } } return penaltyPercent / 100; // Convert to multiplier }>> /* Process trait gains/losses/upgrades after work */ <<set setup.processJobTraitChanges = function(jobName) { var v = State.variables; var config = setup.jobWorkConfig[jobName]; if (!config) return []; var changes = []; // 5% chance to gain a new trait from possibleGains if (Math.random() < 0.05) { var availableGains = config.possibleGains.filter(function(trait) { return !setup.playerHasTrait(trait); }); if (availableGains.length > 0) { var newTrait = availableGains[Math.floor(Math.random() * availableGains.length)]; // Determine where to add it if (setup.traitBonuses[newTrait]) { // Determine if physical or mental var physicalTraits = ["Fit", "Muscular", "Attractive"]; var mentalTraits = ["Confident", "Patient", "Optimistic", "Sarcastic", "Artistic", "Humorous", "Intelligent", "Analytical"]; if (physicalTraits.includes(newTrait)) { v.physicalTraits.push(newTrait); } else if (mentalTraits.includes(newTrait)) { v.mentalTraits.push(newTrait); } } else if (setup.skillBonuses[newTrait]) { v.skills.push(newTrait); } changes.push({type: "gain", trait: newTrait}); } } // 1% chance to upgrade existing traits if (Math.random() < 0.01) { for (var oldTrait in config.traitUpgrades) { if (setup.playerHasTrait(oldTrait)) { var newTrait = config.traitUpgrades[oldTrait]; // Remove old trait v.physicalTraits = v.physicalTraits.filter(function(t) { return t !== oldTrait; }); v.mentalTraits = v.mentalTraits.filter(function(t) { return t !== oldTrait; }); v.skills = v.skills.filter(function(t) { return t !== oldTrait; }); // Add new trait var physicalTraits = ["Muscular"]; var mentalTraits = ["Chill"]; if (physicalTraits.includes(newTrait)) { v.physicalTraits.push(newTrait); } else if (mentalTraits.includes(newTrait)) { v.mentalTraits.push(newTrait); } else if (setup.skillBonuses[newTrait]) { v.skills.push(newTrait); } changes.push({type: "upgrade", oldTrait: oldTrait, newTrait: newTrait}); break; // Only one upgrade per work session } } } // 5% chance to remove a negative trait if (Math.random() < 0.05) { var removableNegatives = config.negativeRemovable.filter(function(trait) { return setup.playerHasTrait(trait); }); if (removableNegatives.length > 0) { var traitToRemove = removableNegatives[Math.floor(Math.random() * removableNegatives.length)]; v.physicalTraits = v.physicalTraits.filter(function(t) { return t !== traitToRemove; }); v.mentalTraits = v.mentalTraits.filter(function(t) { return t !== traitToRemove; }); changes.push({type: "remove", trait: traitToRemove}); } } // 1% chance to replace negative trait with positive if (Math.random() < 0.01) { for (var negativeTrait in config.negativeReplacements) { if (setup.playerHasTrait(negativeTrait)) { var positiveTrait = config.negativeReplacements[negativeTrait]; // Remove negative v.physicalTraits = v.physicalTraits.filter(function(t) { return t !== negativeTrait; }); v.mentalTraits = v.mentalTraits.filter(function(t) { return t !== negativeTrait; }); // Add positive var physicalTraits = ["Fit", "Strong", "Muscular"]; var mentalTraits = ["Patient"]; if (physicalTraits.includes(positiveTrait)) { v.physicalTraits.push(positiveTrait); } else if (mentalTraits.includes(positiveTrait)) { v.mentalTraits.push(positiveTrait); } else if (setup.skillBonuses[positiveTrait]) { v.skills.push(positiveTrait); } changes.push({type: "replace", oldTrait: negativeTrait, newTrait: positiveTrait}); break; // Only one replacement per work session } } } return changes; }>>
/* ================================== */ /* === LAMPREY TOMES BOOKSHOP === */ /* ================================== */ <<set setup.lampreyTraits to { common: { price: 500, chance: 0.90, traits: [ {trait: "Broad-shouldered", type: "physical"}, {trait: "Freckled", type: "physical"}, {trait: "Tattooed", type: "physical"}, {trait: "Deep Voice", type: "voice"}, {trait: "Emotionless Tone", type: "voice"}, {trait: "Grim Tone", type: "voice"}, {trait: "Risk Taker", type: "mental"}, {trait: "Overthinker", type: "mental"}, {trait: "Quiet", type: "mental"}, {trait: "Clingy", type: "mental"}, {trait: "Impulsive", type: "mental"}, {trait: "Disorganized", type: "mental"}, {trait: "Forgetful", type: "mental"}, {trait: "Cowardly", type: "mental"}, {trait: "Insecure", type: "mental"}, {trait: "Brave", type: "mental"}, {trait: "Witty", type: "mental"}, {trait: "Passive", type: "mental"}, {trait: "Stubborn", type: "mental"}, {trait: "Paranoid", type: "mental"}, {trait: "Bitchy", type: "mental"}, {trait: "Foolish", type: "mental"}, {trait: "Flat Chest", type: "physical"}, {trait: "Flat Butt", type: "physical"}, {trait: "Flat Masculine Chest", type: "physical"}, {trait: "Flat Masculine Butt", type: "physical"} ] }, uncommon: { price: 2000, chance: 0.20, traits: [ {trait: "Articulate Speech", type: "voice"}, {trait: "Submissive", type: "mental"}, {trait: "Sturdy", type: "physical"}, {trait: "Artistic", type: "mental"}, {trait: "Small Chest", type: "physical"}, {trait: "Small Butt", type: "physical"} ] }, rare: { price: 5000, chance: 0.05, traits: [ {trait: "Youthful", type: "physical"}, {trait: "Attractive", type: "physical"}, {trait: "Sly", type: "mental"}, {trait: "Curvy", type: "physical"}, {trait: "Voluptuous", type: "physical"}, {trait: "Perceptive", type: "mental"}, {trait: "Large Chest", type: "physical"}, {trait: "Large Butt", type: "physical"}, {trait: "Medium Chest", type: "physical"}, {trait: "Medium Butt", type: "physical"} ] }, aethereal: { price: 10000, chance: 0.01, traits: [ {trait: "Giant Chest", type: "physical"}, {trait: "Giant Butt", type: "physical"}, {trait: "Huge Chest", type: "physical"}, {trait: "Huge Butt", type: "physical"}, {trait: "Goth", type: "mental"}, {trait: "Nerd", type: "mental"}, {trait: "Jock", type: "mental"}, {trait: "Prep", type: "mental"}, {trait: "Dominant", type: "mental"} ] }, legendary: { price: 50000, chance: 0.001, traits: [ {trait: "Were-Creature", type: "physical"}, {trait: "Lucky", type: "mental"}, {trait: "Occult Expert", type: "skill"}, {trait: "Gigantic Chest", type: "physical"}, {trait: "Gigantic Butt", type: "physical"} ] } }>> <<set setup.generateLampreyInventory to function() { var inventory = []; var guaranteedCommon = setup.lampreyTraits.common.traits.random(); inventory.push({ trait: guaranteedCommon.trait, type: guaranteedCommon.type, rarity: 'common', price: setup.lampreyTraits.common.price }); for (var i = 0; i < 3; i++) { var selectedRarity = null; var roll = Math.random(); if (roll < setup.lampreyTraits.legendary.chance) { selectedRarity = 'legendary'; } else if (roll < setup.lampreyTraits.aethereal.chance) { selectedRarity = 'aethereal'; } else if (roll < setup.lampreyTraits.rare.chance) { selectedRarity = 'rare'; } else if (roll < setup.lampreyTraits.uncommon.chance) { selectedRarity = 'uncommon'; } else { selectedRarity = 'common'; } var rarityData = setup.lampreyTraits[selectedRarity]; var traitData = rarityData.traits.random(); if (!inventory.some(function(item) { return item.trait === traitData.trait; })) { inventory.push({ trait: traitData.trait, type: traitData.type, rarity: selectedRarity, price: rarityData.price }); } else { i--; } } return inventory; }>> <<set setup.shouldRefreshLampreyInventory to function() { var currentDay = State.variables.dayNumber; var lastRefreshDay = State.variables.lampreyLastRefreshDay || -1; var currentHour = Math.floor(State.variables.timeInMinutes / 60) % 24; if (currentDay > lastRefreshDay && currentHour >= 12) { return true; } return false; }>> <<set setup.getRarityColor to function(rarity) { var colors = { common: '#aaa', uncommon: '#51cf66', rare: '#339af0', aethereal: '#b19cd9', legendary: '#ffd700' }; return colors[rarity] || '#aaa'; }>> <<set setup.getRarityName to function(rarity) { var names = { common: 'Common', uncommon: 'Uncommon', rare: 'Rare', aethereal: 'Aethereal', legendary: 'Legendary' }; return names[rarity] || 'Unknown'; }>> /* Handle special body part traits that modify appearance directly */ <<set setup.applyLampreyBodyTrait to function(trait) { var v = State.variables; // Handle chest size traits if (trait === "Gigantic Chest") { v.bodyParts.chest = "gigantic"; return true; } if (trait === "Giant Chest") { v.bodyParts.chest = "giant"; return true; } if (trait === "Huge Chest") { v.bodyParts.chest = "huge"; return true; } if (trait === "Large Chest") { v.bodyParts.chest = "large"; return true; } if (trait === "Medium Chest") { v.bodyParts.chest = "medium"; return true; } if (trait === "Small Chest") { v.bodyParts.chest = "small"; return true; } if (trait === "Flat Chest") { v.bodyParts.chest = "flat"; return true; } if (trait === "Flat Masculine Chest") { v.bodyParts.chest = "flat masculine"; return true; } // Handle butt size traits if (trait === "Gigantic Butt") { v.bodyParts.butt = "gigantic"; return true; } if (trait === "Giant Butt") { v.bodyParts.butt = "giant"; return true; } if (trait === "Huge Butt") { v.bodyParts.butt = "huge"; return true; } if (trait === "Large Butt") { v.bodyParts.butt = "large"; return true; } if (trait === "Medium Butt") { v.bodyParts.butt = "medium"; return true; } if (trait === "Small Butt") { v.bodyParts.butt = "small"; return true; } if (trait === "Flat Butt") { v.bodyParts.butt = "flat"; return true; } if (trait === "Flat Masculine Butt") { v.bodyParts.butt = "flat masculine"; return true; } return false; }>> <<set setup.hasLampreyTrait to function(trait) { var v = State.variables; // Check chest size traits - only allow if it would change current value if (trait === "Gigantic Chest") { return v.bodyParts.chest === "gigantic"; } if (trait === "Giant Chest") { return v.bodyParts.chest === "giant"; } if (trait === "Huge Chest") { return v.bodyParts.chest === "huge"; } if (trait === "Large Chest") { return v.bodyParts.chest === "large"; } if (trait === "Medium Chest") { return v.bodyParts.chest === "medium"; } if (trait === "Small Chest") { return v.bodyParts.chest === "small"; } if (trait === "Flat Chest") { return v.bodyParts.chest === "flat"; } if (trait === "Flat Masculine Chest") { return v.bodyParts.chest === "flat masculine"; } // Check butt size traits - only allow if it would change current value if (trait === "Gigantic Butt") { return v.bodyParts.butt === "gigantic"; } if (trait === "Giant Butt") { return v.bodyParts.butt === "giant"; } if (trait === "Huge Butt") { return v.bodyParts.butt === "huge"; } if (trait === "Large Butt") { return v.bodyParts.butt === "large"; } if (trait === "Medium Butt") { return v.bodyParts.butt === "medium"; } if (trait === "Small Butt") { return v.bodyParts.butt === "small"; } if (trait === "Flat Butt") { return v.bodyParts.butt === "flat"; } if (trait === "Flat Masculine Butt") { return v.bodyParts.butt === "flat masculine"; } // Check physical traits array if (v.physicalTraits && v.physicalTraits.includes(trait)) { return true; } // Check mental traits array if (v.mentalTraits && v.mentalTraits.includes(trait)) { return true; } // Check skills array if (v.skills && v.skills.includes(trait)) { return true; } // Check voice traits array if (v.voiceTraits && v.voiceTraits.includes(trait)) { return true; } return false; }>> <<set setup.addLampreyTrait to function(trait, type) { var v = State.variables; // Check if it's a body part modification trait if (setup.applyLampreyBodyTrait(trait)) { return; // Body part was modified, no need to add to trait arrays } // Handle conflicts for regular traits var allTraits = v.physicalTraits.concat(v.mentalTraits).concat(v.skills); if (v.voiceTraits) allTraits = allTraits.concat(v.voiceTraits); var conflict = setup.getConflictingTrait(trait, allTraits); if (conflict) { // Remove conflicting trait v.physicalTraits.delete(conflict); v.mentalTraits.delete(conflict); v.skills.delete(conflict); if (v.voiceTraits) v.voiceTraits.delete(conflict); } // Add the new trait if (type === "physical") { v.physicalTraits.push(trait); } else if (type === "mental") { v.mentalTraits.push(trait); } else if (type === "skill") { v.skills.push(trait); } else if (type === "voice") { if (!v.voiceTraits) v.voiceTraits = []; v.voiceTraits.push(trait); } }>> /* Tome name mappings for traits */ <<set setup.traitTomeNames = { // Physical Traits "Broad-shouldered": "Tome of Titan's Frame", "Freckled": "Chronicle of Sun Kisses", "Tattooed": "Book of Living Ink", "Sturdy": "Codex of Endurance", "Youthful": "Manuscript of Eternal Youth", "Attractive": "Grimoire of Allure", "Curvy": "Scroll of Flowing Form", "Voluptuous": "Testament of Abundance", "Gigantic Chest": "Primordial Tome of Divine Endowment", "Gigantic Butt": "Ancient Chronicle of Legendary Curves", "Giant Chest": "Tome of Magnificent Proportions", "Giant Butt": "Chronicle of Grand Curves", "Huge Chest": "Chronicle of Bountiful Curves", "Huge Butt": "Testament of Voluptuous Depths", "Large Chest": "Grimoire of Generous Form", "Large Butt": "Tome of Ample Proportions", "Medium Chest": "Scroll of Balanced Figure", "Medium Butt": "Manuscript of Balanced Curves", "Small Chest": "Book of Modest Proportions", "Small Butt": "Scroll of Petite Form", "Flat Chest": "Manual of Sleek Lines", "Flat Butt": "Book of Athletic Lines", "Flat Masculine Chest": "Codex of Chiseled Pecs", "Flat Masculine Butt": "Guide to Firm Glutes", "Were-Creature": "Forbidden Bestiary", // Voice Traits "Deep Voice": "Book of Resonant Depths", "Emotionless Tone": "Manual of Stoic Speech", "Grim Tone": "Diary of Dark Words", "Articulate Speech": "Lexicon of Eloquence", // Mental Traits "Risk Taker": "Journal of Bold Ventures", "Overthinker": "Compendium of Endless Thoughts", "Quiet": "Whisper Manuscript", "Clingy": "Book of Attachment", "Impulsive": "Scroll of Rash Actions", "Disorganized": "Chaotic Chronicles", "Forgetful": "Fading Memoir", "Cowardly": "Tome of Fearful Hearts", "Insecure": "Journal of Self-Doubt", "Brave": "Codex of Courage", "Witty": "Book of Quick Minds", "Passive": "Manual of Peaceful Ways", "Stubborn": "Testament of Unyielding Will", "Paranoid": "Scroll of Eternal Vigilance", "Bitchy": "Grimoire of Sharp Tongues", "Foolish": "Chronicle of Poor Judgment", "Submissive": "Book of Obedience", "Artistic": "Canvas of Creation", "Sly": "Tome of Cunning Shadows", "Perceptive": "All-Seeing Manuscript", "Goth": "Grimoire of Darkness", "Nerd": "Encyclopedia of Knowledge", "Jock": "Manual of Athletic Prowess", "Prep": "Guide to Social Grace", "Dominant": "Tome of Command", "Lucky": "Scroll of Fortune's Favor", // Skills "Occult Expert": "Necronomicon Fragment" }>> <<set setup.getTraitTomeName = function(trait) { return setup.traitTomeNames[trait] || "Mysterious Tome of " + trait; }>> <<set setup.getLampreyDiscount = function() { var relationship = State.variables.relationships["Revna McKraken"] || {level: 1, points: 0}; var discounts = { 1: 0, // Stranger - no discount 2: 0.03, // Acquaintance - 3% discount 3: 0.07, // Friend - 7% discount 4: 0.12, // Close Friend - 12% discount 5: 0.20 // Best Friend - 20% discount }; return discounts[relationship.level] || 0; }>> <<set setup.calculateLampreyPrice = function(basePrice) { var discount = setup.getLampreyDiscount(); return Math.floor(basePrice * (1 - discount)); }>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">💃 Stripper Shift</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0;"> You're on shift at the Electric Jelly Revue. The club is alive with energy, music pulsing through the air. What do you want to do? </p> </div> <h2 style="color: #9D00FF;">Work Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Dance on Stage --> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #9D00FF; margin: 0 0 10px 0;">🎭 Dance on Stage</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Take the main stage and perform for the crowd. Choose your style and level of performance.</p> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take the Stage</div>">> <<goto "StripClubStagePerformance">> <</link>> </div> <!-- Private Shows --> <div style="border: 3px solid #FF1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #FF1493; margin: 0 0 10px 0;">👤 Private Shows</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Perform exclusive private shows for VIP customers. Higher pay, more intimate atmosphere.</p> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Check for Requests</div>">> <<goto "StripClubPrivateShows">> <</link>> </div> <!-- Mingle with Customers --> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #FFD700; margin: 0 0 10px 0;">💬 Mingle with Customers</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Work the floor, chat with patrons, and earn tips through conversation and charm.</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Work the Floor</div>">> <<goto "StripClubMingleCustomers">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>End Shift</div>">> <<goto "StripClub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">🛡️ Bouncer Shift</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0;"> You take your position at the Electric Jelly Revue. Your job is to keep order, check IDs, and make sure everyone stays safe. The club needs you watching over things. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9D00FF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9D00FF; margin-top: 0;">Your Shift</h2> <<set _earnings = setup.workJob()>> <<set $hoursWorkedToday += 1>> <<run setup.advanceTime(60)>> <p style="color: #51cf66; font-size: 18px; font-weight: bold;"> You earned $<<print _earnings>> for your shift! </p> <p style="color: #ccc; margin-top: 15px;"> You kept watch over the club, checking IDs at the door and keeping an eye on the crowd. A few rowdy patrons needed to be escorted out, but nothing you couldn't handle. The night passed smoothly under your watchful eye. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Strip Club</div>">> <<goto "StripClub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">🎭 Stage Performance</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0;"> You step onto the main stage as the spotlight hits you. The crowd's attention turns your way. The music starts to build. How do you want to perform? </p> </div> <h2 style="color: #9D00FF;">Performance Style</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Remove Top --> <div style="border: 3px solid #FF69B4; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #FF69B4; margin: 0 0 10px 0;">👚 Remove Top</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Tease the crowd by slowly removing your top while dancing.</p> <<link "<div style='background: linear-gradient(135deg, #FF69B4 0%, #FF1493 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Remove Top</div>">> <<goto "StripClubPerformRemoveTop">> <</link>> </div> <!-- Strip Completely --> <div style="border: 3px solid #FF1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #FF1493; margin: 0 0 10px 0;">🔥 Strip Completely</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Give them the full show - strip down completely for maximum tips.</p> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Strip Completely</div>">> <<goto "StripClubPerformStripFull">> <</link>> </div> <!-- Pole Dance --> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #9D00FF; margin: 0 0 10px 0;">💫 Pole Dance</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Show off your athletic skills with impressive pole work.</p> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Pole Dance</div>">> <<goto "StripClubPerformPole">> <</link>> </div> <!-- Freestyle --> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h4 style="color: #FFD700; margin: 0 0 10px 0;">✨ Freestyle</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Dance however you feel - let your creativity and charisma shine.</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Freestyle</div>">> <<goto "StripClubPerformFreestyle">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FF1493; text-align: center;">👤 Private Shows</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FF1493;"> <p style="color: white; font-size: 18px; margin: 0;"> You check the private room schedule to see if any VIP customers have requested you for an exclusive performance. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FF1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; text-align: center; font-style: italic;"> [Private show content will be expanded here] </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💬 Mingle with Customers</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> You move through the club floor, making eye contact with customers, sitting at tables, and working your charm to earn tips. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; text-align: center; font-style: italic;"> [Mingling content will be expanded here] </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Brothel">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #007FFF; text-align: center;">👑 Brothel Management</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/BrothelOffice.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Management Office"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #007FFF;"> <p style="color: white; font-size: 18px; margin: 0;"> Your private office overlooks the main floor through one-way glass. Leather furniture, a polished mahogany desk, and walls lined with financial reports and security monitors. From here, you control every aspect of the Azure Angelfish Lounge. </p> </div> <h2 style="color: #007FFF;">Management Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- View Finances --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">💰 View Finances</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Review income, expenses, and overall profitability of your establishment.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Staff Management --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">👥 Staff Management</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Hire, fire, and manage your workers. Review their performance and assign schedules.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Upgrade Facilities --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">🏗️ Upgrade Facilities</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Improve rooms, add amenities, and expand your establishment to attract higher-paying clients.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Set Pricing --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">💵 Set Pricing</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Adjust service prices to maximize profit while maintaining clientele.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Performance Reviews --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">📊 Performance Reviews</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Analyze worker performance metrics, client satisfaction, and revenue per employee.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Marketing & Advertising --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">📢 Marketing</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Run advertising campaigns and promotions to attract new clients and boost reputation.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Security & Discretion --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">🔒 Security</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Manage security systems, background checks, and maintain client discretion protocols.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Special Services --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">✨ Special Services</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Develop and manage premium, exclusive services for VIP clientele.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Brothel Floor</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize Sunfish counter if it doesn't exist --> <<if !$sunfishSightings>> <<set $sunfishSightings = 0>> <</if>> <!-- Get Mayor's Gender --> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<set _mayorGender = "unknown">> <<if _mayorNPCs.length > 0>> <<set _mayorGender = _mayorNPCs[0].bodyParts.gender>> <</if>> <!-- Calculate Attractiveness Score --> <<set _attractiveTraits = ["Attractive", "Curvy", "Voluptuous", "Charming", "Seductive", "Alluring", "Flirty", "Smooth Skin", "Youthful", "Graceful", "Fashionable", "Warm", "Charismatic Voice", "Smooth Voice"]>> <<set _masculineTraits = ["Muscular", "Broad-shouldered", "Strong", "Athletic Build", "Sturdy", "Jock", "Fit", "Lean"]>> <<set _feminineTraits = ["Curvy", "Voluptuous", "Soft", "Graceful", "Petite", "Youthful", "Smooth Skin"]>> <<set _attractivenessScore = 0>> <<set _masculinityScore = 0>> <<set _femininityScore = 0>> <<for _trait range _attractiveTraits>> <<if $physicalTraits.includes(_trait) || $mentalTraits.includes(_trait)>> <<set _attractivenessScore += 1>> <</if>> <</for>> <<for _trait range _masculineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _masculinityScore += 1>> <</if>> <</for>> <<for _trait range _feminineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _femininityScore += 1>> <</if>> <</for>> <!-- Chest size bonus for female player with male mayor --> <<set _chestBonus = 0>> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _chestSizes = ["flat", "small", "medium", "large", "huge", "giant"]>> <<set _chestIndex = _chestSizes.indexOf($bodyParts.chest.toLowerCase())>> <<if _chestIndex >= 0>> <<set _chestBonus = _chestIndex * 5>> <</if>> <</if>> <!-- Calculate base erotic task chance --> <<set _eroticChance = 20>> <!-- Gender-based modifiers --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticChance += (_attractivenessScore * 5) + (_femininityScore * 5) + _chestBonus>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticChance += (_attractivenessScore * 5) + (_masculinityScore * 8)>> <<elseif $bodyParts.gender === _mayorGender>> <!-- Same gender - requires high attractiveness + specific traits --> <<if $bodyParts.gender === "male" && $mentalTraits.includes("Femboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<elseif $bodyParts.gender === "female" && $mentalTraits.includes("Tomboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<else>> <<set _eroticChance = 0>> <</if>> <</if>> <!-- Cap at 85% --> <<if _eroticChance > 85>> <<set _eroticChance = 85>> <</if>> <!-- Determine task type --> <<set _taskRoll = random(1, 100)>> <<set _isEroticTask = _taskRoll <= _eroticChance>> <!-- Check for Sunfish trait event (1% chance) --> <<set _sunfishEvent = false>> <<if $skills.includes("Sunfish") && random(1, 100) === 1>> <<set _sunfishEvent = true>> <<set $sunfishSightings += 1>> <</if>> <!-- Check if going to The Alter --> <<if $sunfishSightings >= 10>> <<goto "TheAlter">> <</if>> <!-- Calculate erotic payment based on traits (75-250) --> <<set _traitPaymentScore = _attractivenessScore + _masculinityScore + _femininityScore + (_chestBonus / 5)>> <<set _eroticPay = Math.floor(75 + (_traitPaymentScore * 12))>> <<if _eroticPay > 250>> <<set _eroticPay = 250>> <</if>> <!-- Generate Task --> <<if !_isEroticTask>> <!-- NORMAL TASK --> <<set _normalTasks = [ {desc: "File paperwork and organize the mayor's schedule", pay: 30}, {desc: "Answer phone calls and respond to emails", pay: 25}, {desc: "Prepare meeting notes and agendas", pay: 35}, {desc: "Coordinate with other city departments", pay: 40}, {desc: "Review and proofread city documents", pay: 30}, {desc: "Manage the mayor's calendar and appointments", pay: 35}, {desc: "Order office supplies and maintain inventory", pay: 25}, {desc: "Greet visitors and direct them appropriately", pay: 30} ]>> <<set _task = _normalTasks.random()>> <<set _taskType = "normal">> <<else>> <!-- EROTIC TASK --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticTasks = [ {desc: "sit on the mayor's lap during a 'private meeting'", pay: _eroticPay, passage: "SecretaryEroticLap"}, {desc: "massage the mayor's shoulders while he works", pay: _eroticPay, passage: "SecretaryEroticMassage"}, {desc: "wear a more 'professional' outfit the mayor has selected", pay: _eroticPay, passage: "SecretaryEroticOutfit"}, {desc: "take dictation while sitting very close to the mayor", pay: _eroticPay, passage: "SecretaryEroticDictation"}, {desc: "help the mayor 'relieve stress' under his desk", pay: _eroticPay, passage: "SecretaryEroticDesk"}, {desc: "model the new 'city uniform' for the mayor's approval", pay: _eroticPay, passage: "SecretaryEroticModel"}, {desc: "give the mayor a 'special presentation' behind closed doors", pay: _eroticPay, passage: "SecretaryEroticPresentation"} ]>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticTasks = [ {desc: "let the mayor admire your physique during a 'fitness consultation'", pay: _eroticPay, passage: "SecretaryEroticPhysique"}, {desc: "assist the mayor with 'personal stress relief'", pay: _eroticPay, passage: "SecretaryEroticRelief"}, {desc: "provide the mayor with a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageFemale"}, {desc: "model swimwear for the mayor's 'aquatics initiative review'", pay: _eroticPay, passage: "SecretaryEroticSwimwear"}, {desc: "help the mayor with 'personal satisfaction' in her private office", pay: _eroticPay, passage: "SecretaryEroticSatisfaction"}, {desc: "demonstrate your strength by lifting the mayor", pay: _eroticPay, passage: "SecretaryEroticLift"}, {desc: "provide 'intimate assistance' as requested", pay: _eroticPay, passage: "SecretaryEroticAssist"} ]>> <<else>> <!-- Same gender tasks --> <<set _eroticTasks = [ {desc: "help the mayor with a 'private wardrobe consultation'", pay: _eroticPay, passage: "SecretaryEroticWardrobe"}, {desc: "provide the mayor with 'personal companionship'", pay: _eroticPay, passage: "SecretaryEroticCompanion"}, {desc: "give the mayor a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageSame"}, {desc: "model clothing for the mayor's review", pay: _eroticPay, passage: "SecretaryEroticModelSame"}, {desc: "assist with the mayor's 'special needs'", pay: _eroticPay, passage: "SecretaryEroticNeeds"} ]>> <</if>> <<set _task = _eroticTasks.random()>> <<set _taskType = "erotic">> <</if>> <!-- Store task info globally for sub-passages --> <<set $currentTask = _task>> <<set $currentTaskType = _taskType>> <!-- Check for forced acceptance (Bimbo/Submissive) --> <<set _canRefuse = true>> <<set _forceAcceptChance = 0>> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 75>> <<elseif $mentalTraits.includes("Bimbo") || $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 50>> <</if>> <<set _forcedAcceptance = false>> <<if _forceAcceptChance > 0 && random(1, 100) <= _forceAcceptChance>> <<set _forcedAcceptance = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">✨ Special Assignment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> You enter the mayor's private office. The door closes behind you with a soft click. </p> </div> <!-- Sunfish Event --> <<if _sunfishEvent>> <div style="background: #1a3a4a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a9eff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> For a brief moment, you catch a glimpse of something in your peripheral vision - a shadowy figure that appears to be made of several sunfish stacked in a trench coat. When you turn to look, there's nothing there. Just an empty corner of the office. </p> <p style="color: #74c0fc; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> (Strange sightings: $sunfishSightings/10) </p> </div> <</if>> <!-- Task Description --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; margin-top: 0;">The Mayor's Request</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#666<</if>>;"> <p style="color: #ccc; font-size: 16px; margin: 0;"> The mayor asks you to <strong style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>;"><<print _task.desc>></strong>. </p> <<if _taskType === "erotic">> <p style="color: #ffc107; font-size: 14px; margin: 15px 0 0 0; font-style: italic;"> This definitely wasn't in your job description... </p> <</if>> </div> <div style="margin-top: 20px; padding: 15px; background: #1a1a1a; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0;"> Payment: <strong>$<<print _task.pay>></strong> </p> <<if _taskType === "erotic">> <p style="color: #ff6b6b; font-size: 14px; margin: 5px 0 0 0;"> Refusing will result in reduced pay ($<<print Math.floor(_task.pay * 0.3)>>) </p> <</if>> </div> </div> <!-- Decision Options --> <<if _forcedAcceptance && _taskType === "erotic">> <!-- Forced Acceptance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ff6b6b; font-size: 16px; text-align: center; margin: 0 0 15px 0; font-style: italic;"> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> Your submissive nature and scattered thoughts make it impossible to refuse. You find yourself nodding automatically. <<else>> Something about the request makes you unable to say no. Your body moves on its own. <</if>> </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Comply</div>">> <<goto _task.passage>> <</link>> </div> <<else>> <!-- Normal Choice --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Accept --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✓ Accept</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Do as the mayor requests </p> <<if _taskType === "erotic">> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <<goto _task.passage>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <<set $money += _task.pay>> <<run window.advanceTime(60)>> <<set $acceptedEroticTask = false>> <<goto "SecretaryTaskResult">> <</link>> <</if>> </div> <!-- Refuse --> <<if _taskType === "erotic">> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">✗ Refuse</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Politely decline </p> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Refuse Task</div>">> <<set $money += Math.floor(_task.pay * 0.3)>> <<run window.advanceTime(60)>> <<set $acceptedEroticTask = false>> <<set $refusedTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> <</if>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize Sunfish counter if it doesn't exist --> <<if !$sunfishSightings>> <<set $sunfishSightings = 0>> <</if>> <!-- Initialize daily mayor work hours if it doesn't exist --> <<if !$mayorHoursWorkedToday>> <<set $mayorHoursWorkedToday = 0>> <</if>> <!-- Initialize mayor salary if it doesn't exist --> <<if !$mayorWeeklySalaryAvailable>> <<set $mayorWeeklySalaryAvailable = 0>> <</if>> <!-- Check for midnight Sunday Alter event (BEFORE time advances) --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <<if $dayOfWeek === "Sunday" && _currentHour === 0 && random(1, 100) <= 10>> <<goto "TheAlter">> <</if>> <!-- Check for Sunfish trait event (1% chance) --> <<set _sunfishEvent = false>> <<if $skills.includes("Sunfish") && random(1, 100) === 1>> <<set _sunfishEvent = true>> <<set $sunfishSightings += 1>> <</if>> <!-- Check if going to The Alter --> <<if $sunfishSightings >= 10>> <<goto "TheAlter">> <</if>> <!-- Only advance time and increment hours if coming from outside (not from task result) --> <<set _justWorked = false>> <<if !$comingFromTaskResult>> <<run window.advanceTime(60)>> <<set $mayorHoursWorkedToday += 1>> <<set _justWorked = true>> <</if>> <<set $comingFromTaskResult = false>> <!-- Check for Corrupt trait gain (5% chance when completing 4th hour) --> <<set _gainedCorrupt = false>> <<if _justWorked && $mayorHoursWorkedToday === 4>> <<if random(1, 100) <= 5>> <<if !$mentalTraits.includes("Corrupt")>> <<set $mentalTraits.push("Corrupt")>> <<set _gainedCorrupt = true>> <</if>> <</if>> <</if>> <!-- Generate fake work task --> <<set _fakeWorkTasks = [ "create a comprehensive report on the city's imaginary budget surplus", "organize files that are already perfectly organized", "schedule meetings that will never actually happen", "proofread documents that don't need proofreading", "draft memos about initiatives that don't exist", "compile statistics on non-existent city projects", "review proposals that have already been approved", "research topics that aren't relevant to anything", "prepare presentations for cancelled meetings", "file paperwork in triplicate for no reason" ]>> <<set _assignedTask = _fakeWorkTasks.random()>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👑 Mayoral Duties</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> You sit in your luxurious office, contemplating what meaningless busywork to assign today. The leather chair is comfortable. The view is excellent. The salary is generous. </p> </div> <!-- Corrupt Trait Gained Notification --> <<if _gainedCorrupt>> <div style="background: #3a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255,107,107,0.3);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">⚠️ TRAIT GAINED ⚠️</h3> <p style="color: #ff8787; font-size: 16px; margin: 0; text-align: center; font-weight: bold;"> You've gained the "Corrupt" trait! </p> <p style="color: #ffc9c9; font-size: 14px; margin: 10px 0 0 0; text-align: center; font-style: italic;"> All this power and no oversight... it's starting to affect you. </p> </div> <</if>> <!-- Sunfish Event --> <<if _sunfishEvent>> <div style="background: #1a3a4a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a9eff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> For a brief moment, you catch a glimpse of something in your peripheral vision - a shadowy figure that appears to be made of several sunfish stacked in a trench coat. When you turn to look, there's nothing there. Just an empty corner of your office. </p> <p style="color: #74c0fc; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> (Strange sightings: $sunfishSightings/10) </p> </div> <</if>> <!-- Weekly Salary Withdrawal --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#666<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#888<</if>>; margin-top: 0;">💰 Weekly Salary</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#666<</if>>;"> <p style="color: #ccc; font-size: 18px; text-align: center; margin: 0 0 10px 0;"> Available to Withdraw: <strong style="color: <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#888<</if>>;">$<<print $mayorWeeklySalaryAvailable>></strong> </p> <<if $mayorWeeklySalaryAvailable > 0>> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Your weekly salary of $1,000 is ready to collect. </p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Withdraw Salary</div>">> <<set $money += $mayorWeeklySalaryAvailable>> <<set $mayorWeeklySalaryAvailable = 0>> <<goto "MayorWork">> <</link>> <<else>> <p style="color: #888; font-size: 14px; text-align: center; margin: 0; font-style: italic;"> Your next salary will be available on Monday. </p> <</if>> </div> </div> <!-- Work Completed --> <<if _justWorked>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #FFD700; margin-top: 0;">Task Assigned</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #FFD700; text-align: center;"> <p style="color: #ccc; font-size: 16px; margin: 0; line-height: 1.6;"> You assigned your secretary to <strong style="color: #FFD700;"><<print _assignedTask>></strong>. </p> <p style="color: #888; font-size: 14px; margin: 15px 0 0 0; font-style: italic;"> They don't question it. They just nod and get to work on the pointless task. </p> </div> </div> <</if>> <!-- Hours Worked Today --> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid <<if $mayorHoursWorkedToday >= 4>>#ff6b6b<<else>>#4dabf7<</if>>;"> <p style="color: <<if $mayorHoursWorkedToday >= 4>>#ff6b6b<<else>>#4dabf7<</if>>; font-size: 18px; text-align: center; margin: 0;"> Hours "Worked" Today: <strong>$mayorHoursWorkedToday/4</strong> </p> <<if $mayorHoursWorkedToday >= 4>> <p style="color: #ffc107; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> You've reached your daily quota of appearing busy. </p> <</if>> </div> <!-- Action Buttons --> <<if $mayorHoursWorkedToday < 4>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Continue Working --> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #FFD700; margin: 0 0 10px 0; text-align: center;">🔄 Assign More Busywork</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Keep up appearances </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Delegate More Work</div>">> <<goto "MayorWork">> <</link>> </div> <!-- End Shift --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0; text-align: center;">🚪 End Shift</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Leave for the day </p> <<link "<div style='background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> </div> <<else>> <!-- Daily Limit Reached --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">Daily Work Limit Reached</h3> <p style="color: #ccc; text-align: center; margin: 0;"> You've already "worked" your 4 hours today. Time to go home and relax. </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Town Hall</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $sunfishSightings = 0>> <div style="background: #0a1a2a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4dabf7; text-align: center;">🐟 The Alter</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a5a 0%, #0a2a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dabf7; box-shadow: 0 8px 16px rgba(74, 171, 247, 0.3);"> <p style="color: #a5d8ff; font-size: 18px; margin: 0; text-align: center; line-height: 1.6;"> Reality shifts. The office dissolves into impossible geometry. You stand in a circular chamber carved from ancient stone, walls covered in intricate carvings of mola mola - ocean sunfish rendered in exquisite detail. </p> </div> <div style="background: #152535; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 8px 16px rgba(0,0,0,0.6);"> <p style="color: #74c0fc; font-size: 16px; margin: 0 0 20px 0; text-align: center;"> In the center of the chamber sits a massive jewel, pulsing with an otherworldly blue-green light. Sunfish symbols swirl across its surface like living things. You try to lift it, but it's impossibly heavy - as if it weighs more than the world itself. </p> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> The jewel seems to hum with potential. Ancient. Waiting. Not yet ready to yield its secrets. </p> </div> <div style="background: #1a2a3a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 2px solid #666;"> <p style="color: #888; font-size: 14px; margin: 0; text-align: center; font-style: italic;"> This place exists outside of normal space. You sense that something important will happen here... but not yet. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.3);'>Leave The Alter</div>">> <<goto "SeabassPark">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Increase relationship with mayor --> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💋 Private Meeting</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> The mayor gestures to his lap with a knowing smile. "Come here, we have important city business to discuss..." </p> </div> <!-- Player Image --> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Lap.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="On the Mayor's Lap"> </div> <</if>> <!-- Detailed Erotic Description --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You slide onto the mayor's lap, your <<print $bodyParts.butt>> settling against his thighs. His hands immediately claim your waist, fingers digging into your <<if $physicalTraits.includes("Soft")>>soft<<elseif $physicalTraits.includes("Fit")>>toned<</if>> flesh possessively. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Let's review the budget," he murmurs, though you feel his hardness growing beneath you. One hand slides along your stocking-clad thigh, pushing your skirt higher, while the other traces up your ribs<<if $bodyParts.chest !== "flat">>. His palm cups your <<print $bodyParts.chest>> breast through your blouse, thumb circling your nipple until it stiffens<</if>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> He grinds you down against his erection as he pretends to read documents, his breath hot against your neck. His hand slips higher up your thigh, fingers finding the dampness between your legs through your panties. "Such a dedicated secretary," he groans, fingers slipping beneath your blouse. You feel him throb against your ass as his other hand teases your <<print $bodyParts.genitals>>, making you squirm on his lap. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Let's review the budget," he murmurs, though you feel his hardness growing beneath you. One hand slides along your thigh, pushing your skirt higher. His other hand traces up your ribs<<if $bodyParts.chest !== "flat">>, palm cupping your <<print $bodyParts.chest>> chest through your blouse<</if>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> He grinds you down against his erection as he pretends to read documents, his breath hot against your neck. His hand slips higher up your thigh, discovering your own growing arousal beneath your skirt. "Interesting," he chuckles darkly, fingers wrapping around your <<print $bodyParts.genitals>> through the fabric. "My secretary seems to be enjoying this meeting." You feel him throb against your ass as his hands explore freely, stroking you while you're expected to maintain professional composure. </p> <</if>> <<if $physicalTraits.includes("Curvy") || $physicalTraits.includes("Voluptuous")>> <p style="color: #ffc107; font-size: 16px; line-height: 1.8; margin: 0;"> Your curves drive him wild. He grabs handfuls of your body greedily, groaning about how perfect you feel on his lap. </p> <</if>> </div> <!-- Payment --> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> for this 'meeting' </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💼 Under the Desk</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I have a very important meeting in ten minutes. Help me relieve some stress first..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Desk.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Under His Desk"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> He gestures beneath his mahogany desk. You sink to your knees on the plush carpet, crawling into the confined space between his spread legs. His bulge strains against his expensive slacks, already hard with anticipation. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Good girl," he purrs, stroking your <<print $appearance.hairColor.toLowerCase()>> hair. His belt buckle clinks as he frees himself. You're face-to-face with his throbbing cock, thick and demanding. "Show me what a dedicated secretary you are." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your lips wrap around him as he groans, one hand gripping your hair to guide you. He rocks his hips, pushing deeper. Above, you hear him answer his phone—discussing city budgets while you service him beneath his desk. Between your own legs, your <<print $bodyParts.genitals>> grows wet from the degradation. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Good girl," he purrs, stroking your <<print $appearance.hairColor.toLowerCase()>> hair. His belt buckle clinks as he frees himself. You're face-to-face with his throbbing cock—but when his hand slides down to grope you, he discovers your own hardness straining against your skirt. "Well, well," he chuckles darkly. "What do we have here?" </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your lips wrap around him as he groans, one hand gripping your hair while the other reaches under your skirt to stroke your <<print $bodyParts.genitals>>. He rocks his hips, pushing deeper. Above, you hear him answer his phone—discussing city budgets while you service him beneath his desk, your own arousal throbbing in his grip. "My special secretary," he mutters. </p> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> His grip tightens as his voice remains professionally calm. "Yes, councilman... the proposal looks excellent..." He thrusts harder, using your mouth roughly. When he finally finishes, groaning quietly, he keeps you down there for several more minutes—his way of showing who's really in control. </p> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👙 Uniform Modeling</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm considering new uniforms for city employees. Model these options for me..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Model.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling Outfits"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "uniforms" become progressively more revealing. First, a tight pencil skirt and blouse. Then a dress that hugs every curve. Finally, lingerie barely passing as "professional attire"—lace and silk that leaves nothing to the imagination. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Each time you emerge from behind the changing screen, the mayor circles you slowly. His eyes devour every inch of exposed skin. "Turn around. Bend over. Walk toward me." His commands grow bolder, his bulge more obvious. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>In the sheer lace bra, your <<print $bodyParts.chest>> breasts are fully visible, nipples hard from his hungry stare. <</if>>The matching panties barely cover your ass, the damp spot at your crotch revealing your arousal. He approaches, running his hands over the fabric—and what lies beneath. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Perfect fit," he growls, pulling you against him. His erection presses into your stomach as he gropes you thoroughly, hands roaming over your nearly-naked body. His fingers slip beneath the lace panties, finding your wet <<print $bodyParts.genitals>>. "I think we need more 'testing' to ensure quality..." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>In the sheer lace bra, your <<print $bodyParts.chest>> chest is fully visible. <</if>>The matching panties struggle to contain your growing arousal, your <<print $bodyParts.genitals>> straining obviously against the delicate fabric. His eyes widen with interest. "Interesting," he murmurs, approaching slowly. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Perfect fit," he growls, pulling you against him. His erection presses into your stomach as he gropes you thoroughly, hands roaming over your nearly-naked body. One hand wraps around your hardness through the lace. "My secretary has some extra... equipment. How delightful." His fingers slip beneath the lace, stroking your <<print $bodyParts.genitals>> directly. "I think we need more 'testing' to ensure quality..." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💆 Stress Relief Massage</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm so tense from all this paperwork. Be a dear and help me relax..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massaging the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You stand behind his chair, your hands working into his shoulders. He groans appreciatively, leaning back into your touch. "Lower," he instructs, and you comply, working down his back. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> As you lean forward to reach, he tilts his head back<<if $bodyParts.chest !== "flat">>—right between your breasts. You feel his breath on your cleavage as he "accidentally" nuzzles against your <<print $bodyParts.chest>> chest<</if>>. His hands reach back, grabbing your hips and pulling you closer. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "You have magic hands," he purrs, spinning his chair around suddenly. Now you're standing between his spread legs, his face level with your body. His hands slide up the backs of your thighs, under your skirt, gripping your ass. "But I think I need a more... thorough massage." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> He pulls you down onto his lap, guiding your hands to his chest while his roam over your body. What started as a shoulder rub becomes something much more intimate, his arousal pressing insistently against you. His fingers slip beneath your panties, exploring your <<print $bodyParts.genitals>> as you gasp. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "You have magic hands," he purrs, spinning his chair around suddenly. Now you're standing between his spread legs, his face level with your body. His hands slide up the backs of your thighs, under your skirt, gripping your ass. "But I think I need a more... thorough massage." His hand discovers your stiffening arousal through your underwear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> He pulls you down onto his lap, guiding your hands to his chest while his roam over your body. What started as a shoulder rub becomes something much more intimate. "My secretary has their own tension to work out," he growls, hand slipping beneath your skirt to stroke your <<print $bodyParts.genitals>> directly, matching the rhythm of his own arousal grinding against you. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">😈 Personal Satisfaction</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Lock the door. I have very specific needs that require your immediate attention." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Satisfaction.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Satisfying the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The door clicks locked. The mayor is already unbuttoning her blouse, eyes dark with need. "Strip. Everything." Her voice brooks no argument. You obey, clothes falling to the floor until you stand naked before her. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She circles you hungrily, one finger trailing over your skin. "Perfect." She pushes you back onto her desk, scattering papers. Climbing on top of you, she positions herself above your hardening <<print $bodyParts.genitals>>. "I'm going to use you properly now." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She sinks down on you with a moan, taking you to the hilt. Her hips move frantically, using your body for her pleasure. She's wild, desperate—nails scratching your chest<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, hands groping your <<print $bodyParts.chest>> breasts<</if>>, riding you hard and fast. "Yes... fuck... just like that..." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She comes multiple times before she's satisfied, milking every drop from you. Afterwards, she dismounts calmly, adjusting her clothes. "Same time tomorrow," she says casually, as if she didn't just fuck you raw on her desk. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She circles you hungrily, one finger trailing over your skin, sliding between your legs to discover your <<print $bodyParts.genitals>>. Her eyes light up. "Oh, even better." She pushes you back onto her desk, scattering papers. Positioning herself between your spread legs, she grins wickedly. "I'm going to use you properly now." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Her mouth and fingers work you frantically, using your body for her pleasure. She's wild, desperate—nails digging into your thighs<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, one hand reaching up to grope your <<print $bodyParts.chest>> breasts<</if>>, tongue and fingers working you hard and fast. "Yes... taste so good... just like that..." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She makes you come multiple times before she's satisfied, wringing every orgasm from you. Afterwards, she stands calmly, adjusting her clothes and wiping her mouth. "Same time tomorrow," she says casually, as if she didn't just devour you on her desk. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🎭 Private Presentation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> The door locks with a decisive click. "Give me a show. Just for me..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Presentation.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Private Performance"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor settles into his leather chair, already palming his growing erection through his slacks. "Strip. Slowly." His voice is thick with lust. Music plays softly from hidden speakers—your cue to perform. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You sway to the rhythm, unbuttoning your blouse with deliberate slowness. Each revealed inch of skin makes him grip the armrests tighter. The blouse falls. Your bra follows.<<if $bodyParts.chest !== "flat">> Your <<print $bodyParts.chest>> breasts bounce free, and he groans.<</if>> </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The skirt slides down your hips. You stand before him in just your panties and heels, gyrating, touching yourself as he watches hungrily. His cock is fully out now, his hand working it as he devours you with his eyes. The wet spot on your panties grows as you perform. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Come here," he commands when you're completely naked. You straddle his lap, feeling his hardness between your thighs, pressing against your wet <<print $bodyParts.genitals>>. His hands grab your <<print $bodyParts.butt>> ass roughly, grinding you against him. "Such a perfect little performer. Now finish the show properly..." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The skirt slides down your hips. You stand before him in just your panties and heels—but your own arousal is obvious, your <<print $bodyParts.genitals>> tenting the fabric. His eyes widen with surprise then darken with lust. "Well, well," he growls. His cock is fully out now, his hand working it as you continue to dance, your own hardness on display. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Come here," he commands when you're completely naked, both of you fully exposed and hard. You straddle his lap, feeling his cock pressing against your ass while yours stands between you. His hands grab your <<print $bodyParts.butt>> ass roughly, grinding you against him, one hand wrapping around your <<print $bodyParts.genitals>>. "Such a perfect little performer. My special secretary. Now finish the show properly..." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🏊 Aquatics Review</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm reviewing the city pool initiative. Model these swimsuits for me..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Swimwear.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling Swimwear"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "swimsuits" are impossibly small—tight speedos that leave absolutely nothing to the imagination. You emerge from the bathroom, barely covered<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>—the speedo revealing not just your bulge but also your <<print $bodyParts.chest>> chest<</if>>, and the mayor's eyes go wide with hunger. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Turn around. Slowly." She circles you like a predator, drinking in every angle. The speedos cling to your body, outlining everything. <<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>Your <<print $bodyParts.chest>> chest is fully on display, and she licks her lips. <</if>><<if $physicalTraits.includes("Muscular") || $physicalTraits.includes("Athletic Build")>>Your muscles flex as you move, and she bites her lip.<</if>> </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Her hands reach out, tracing over the fabric—and your body beneath. "Very impressive," she purrs, palming your <<print $bodyParts.genitals>> through the thin material. You start to harden, the speedo doing nothing to hide your arousal. She strokes you through the fabric, watching you grow. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need to test... durability." She yanks the speedo down, freeing your erection. "On the desk. Now." She's on you before you can think, riding you hard while praising your "excellent fit for city standards." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "swimsuits" are impossibly small—a tiny bikini bottom that barely covers anything. You emerge from the bathroom, barely covered<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>—wearing just the bikini bottom, your <<print $bodyParts.chest>> chest completely exposed<</if>>, and the mayor's eyes go wide with hunger. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Turn around. Slowly." She circles you like a predator, drinking in every angle. The bikini bottom clings to your body, the fabric already damp. <<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>Your <<print $bodyParts.chest>> breasts are fully on display, and she licks her lips. <</if>><<if $physicalTraits.includes("Muscular") || $physicalTraits.includes("Athletic Build")>>Your muscles flex as you move, and she bites her lip.<</if>> </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Her hands reach out, tracing over the fabric—and your body beneath. "Very impressive," she purrs, fingers sliding beneath the bikini to find your wet <<print $bodyParts.genitals>>. You gasp as she touches you, the thin material providing no protection. She strokes you, making you wetter. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need to test... durability." She yanks the bikini aside, fingers pushing inside you. "On the desk. Now." She has you spread out before her, working you with hands and tongue while praising your "excellent fit for city standards." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💆 Private Massage</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm so tense. Those strong hands of yours... I need them on me." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massaging the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor lies face-down on her office couch, her blouse already unbuttoned and pulled aside. Your <<if $physicalTraits.includes("Strong")>>powerful<<elseif $physicalTraits.includes("Muscular")>>strong<</if>> hands work into her shoulders, kneading the tension from her muscles. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Lower," she moans. You work down her spine, and she reaches back to unhook her bra completely. "Don't be shy." Your hands slide over her bare back, feeling her skin warm beneath your touch. She arches into your massage, sighing with pleasure. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "The backs of my thighs too," she instructs, hiking up her skirt. Your hands move lower, massaging her legs. She spreads them slightly, giving you access. "Higher..." Your fingers brush against her panties, and you feel how wet she is. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She rolls over suddenly, bare-chested and flushed<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her eyes widen as she sees your shirt has come off too, revealing your <<print $bodyParts.chest>> chest. "Interesting," she purrs, reaching up to touch you<</if>>. "I think the front needs attention now." She pulls you down on top of her, hands fumbling with your belt, discovering your hardening <<print $bodyParts.genitals>>. "Use those hands for something even better..." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She rolls over suddenly, bare-chested and flushed<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her eyes widen as she sees your shirt has come off too, revealing your <<print $bodyParts.chest>> chest. "Interesting," she purrs, reaching up to touch you<</if>>. "I think the front needs attention now." She pulls you down on top of her, hands fumbling with your pants. When she discovers your <<print $bodyParts.genitals>>, her eyes light up with delight. "Oh, this is even better than I imagined," she moans, fingers already exploring. "Use those hands on me while I use mine on you..." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👗 Professional Attire</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I've selected a more appropriate outfit for my secretary. Go change." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Outfit.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="New Outfit"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "professional" outfit turns out to be a scandal—a skirt so short it barely covers your ass, and a blouse cut low enough to show<<if $bodyParts.chest !== "flat">> generous cleavage<<else>> your flat chest provocatively<</if>>. Sheer stockings with garters complete the ensemble. The underwear provided is a mere scrap of lace that leaves nothing to the imagination. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "professional" outfit turns out to be a scandal—a skirt so short it barely covers your ass, and a blouse cut provocatively<<if $bodyParts.chest !== "flat">> to show off your <<print $bodyParts.chest>> chest<</if>>. Sheer stockings with garters complete the ensemble. The underwear provided is impossibly tight, doing nothing to hide your <<print $bodyParts.genitals>> and everything to accentuate the bulge. </p> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> When you emerge from the bathroom, the mayor's eyes darken with lust. "Perfect. Come here." He has you bend over to "pick up" dropped papers, stand on tiptoe to reach high shelves, sit with your legs crossed and uncrossed repeatedly. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Every movement is designed to show off your body. He circles you like prey, adjusting the blouse lower, smoothing the skirt higher. His hands linger everywhere—your hips, your thighs<<if $bodyParts.chest !== "flat">>, cupping your breasts to "fix the fit"<</if>>. When you bend over, you know he can see your barely-covered <<print $bodyParts.genitals>> through the flimsy panties. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "You'll wear this every day," he commands, pulling you against him. You feel his hardness pressing into your barely-covered ass. "My perfect little secretary." His hands slide under the skirt, fingers finding your wetness, exploring freely. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Every movement is designed to show off your body. He circles you like prey, adjusting the blouse, smoothing the skirt higher. His hands linger everywhere—your hips, your thighs<<if $bodyParts.chest !== "flat">>, groping your chest<</if>>. The tight underwear makes your arousal obvious, your <<print $bodyParts.genitals>> clearly outlined for his viewing pleasure. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "You'll wear this every day," he commands, pulling you against him. You feel his hardness pressing into your barely-covered ass, while yours presses against his thigh. "My perfect little secretary." His hands slide under the skirt, one gripping your ass while the other wraps around your <<print $bodyParts.genitals>>, stroking through the thin fabric. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💪 Fitness Consultation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Take off your shirt. I want to see your... physical conditioning." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Physique.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Showing Your Body"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You strip off your shirt, standing bare-chested before the mayor. Her eyes rake over your <<if $physicalTraits.includes("Muscular")>>sculpted muscles<<elseif $physicalTraits.includes("Fit")>>toned physique<<else>>body<</if>>, tongue darting out to wet her lips. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Come closer," she purrs. Her hands explore your chest<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, fingers tracing over your <<print $bodyParts.chest>> chest with particular interest. "How unexpected," she murmurs, cupping them<<else>>, tracing your pecs<</if>>, trailing down your abs. She circles you slowly, admiring every angle. Her fingers dig into your <<if $physicalTraits.includes("Strong")>>solid<</if>> muscles appreciatively. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She presses against your back, hands sliding around your waist, lower and lower. "Very impressive," she breathes in your ear. Her palms cup the bulge in your pants, squeezing your hardening <<print $bodyParts.genitals>>. "I want to see all of you. Everything." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're completely naked as she examines you thoroughly, hands everywhere—gripping your ass, stroking your cock until you're rock hard<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, playing with your chest<</if>>. "Perfect specimen," she moans, pushing you back onto her desk. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She presses against your back, hands sliding around your waist, lower and lower. "Very impressive," she breathes in your ear. Her palms slide to your crotch, then pause with surprise. "Well now," she purrs with delight, fingers exploring the unexpected anatomy beneath your pants. "What a delightful surprise. I want to see all of you. Everything." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're completely naked as she examines you thoroughly, hands everywhere—gripping your ass, fingers teasing your wet <<print $bodyParts.genitals>><<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, playing with your chest<</if>>. "Perfect specimen," she moans, spreading your legs wider. "Such a rare treat." She pushes you back onto her desk, hands already between your thighs. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💪 Strength Demonstration</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Show me how strong you really are. Lift me up..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Lift.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Lifting the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You wrap your <<if $physicalTraits.includes("Muscular")>>powerful<<elseif $physicalTraits.includes("Strong")>>strong<</if>> arms around her waist and lift her effortlessly. She gasps, wrapping her legs around you instinctively. "Oh my..." Her face is level with yours now, breathing heavily. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Higher," she demands. You hoist her up, her legs tightening around your torso. She's grinding against you now, her skirt hiked up, feeling your strength<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her hands find your <<print $bodyParts.chest>> chest through your shirt, squeezing<</if>>. "So strong..." She's getting wet, you can feel it through your shirt. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She kisses you hard, tongue invading your mouth. Her hands fumble with your belt while you hold her up. "Don't put me down," she orders breathlessly. You brace her against the wall, supporting her weight easily. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She frees your <<print $bodyParts.genitals>> and guides you inside her, moaning as you fill her. You fuck her standing up, using your strength to bounce her on your shaft. She clings to you, screaming her pleasure, loving how you manhandle her with such ease. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She kisses you hard, tongue invading your mouth. Her hands fumble with your pants while you hold her up. "Don't put me down," she orders breathlessly. When she discovers your <<print $bodyParts.genitals>>, she groans. "Oh fuck yes. Against the wall. Now." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> You brace her against the wall, supporting her weight easily while she works her hand between your legs, fingers pushing inside your wet heat. You grind against her hand, using your strength to control the pace. She clings to you, moaning her pleasure, loving how strong you are, how you can hold her up while she fingers you. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">📝 Taking Dictation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Sit close. I need you to take these notes personally..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Dictation.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Taking Dictation"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You pull your chair next to his, notepad ready. But he pulls you even closer—so close your thigh presses against his, your shoulder touching his arm. His cologne fills your senses as he leans in, lips nearly brushing your ear. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Regarding the city infrastructure project..." he begins, but his hand finds your knee, sliding slowly up your thigh. His whispers tickle your neck, making you shiver. The "dictation" becomes increasingly nonsensical as his hand ventures higher, fingers teasing the hem of your skirt before slipping beneath it to find your dampening panties. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>His other arm wraps around your back, hand cupping your breast through your blouse. He squeezes in rhythm with his words, thumb circling your nipple. <</if>>You try to write but your pen trembles as he touches you, fingers rubbing against your <<print $bodyParts.genitals>> through the thin fabric, his breath hot and heavy in your ear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Are you getting all this?" he growls, pulling you onto his lap. The notepad falls forgotten as he grinds you against his obvious arousal, his fingers pushing your panties aside to stroke you directly. "I think you need to take better notes. Much more... hands-on study." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Regarding the city infrastructure project..." he begins, but his hand finds your knee, sliding slowly up your thigh. His whispers tickle your neck, making you shiver. The "dictation" becomes increasingly nonsensical as his hand ventures higher, fingers teasing the hem of your skirt before discovering your growing arousal straining against your underwear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>His other arm wraps around your back, hand groping your <<print $bodyParts.chest>> chest. <</if>>You try to write but your pen trembles as he touches you, fingers wrapping around your <<print $bodyParts.genitals>> through the fabric, stroking in slow, deliberate movements, his breath hot and heavy in your ear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Are you getting all this?" he growls, pulling you onto his lap. The notepad falls forgotten as he grinds against your ass, his hand slipping beneath your underwear to stroke your hardness directly. "My secretary seems very... attentive today. I think you need to take better notes. Much more... hands-on study." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">😌 Stress Relief</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I need to unwind. Help me relax... properly." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Relief.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Providing Relief"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor reclines on her office couch, hiking up her skirt. "Come here," she commands, spreading her legs. You kneel between her thighs, her scent filling your nose as she guides your head where she wants it. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your tongue finds her wet heat, and she gasps, fingers tangling in your hair. "Yes... just like that..." She grinds against your face, using your mouth for her pleasure. Her thighs clamp around your head as you work. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She comes hard, crying out without caring who might hear. But she's not done. "Stand up. Take off your pants." When you're exposed, your <<print $bodyParts.genitals>> hard and ready, she pulls you down onto the couch with surprising strength. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She rides you aggressively, nails raking down your chest<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, groping your <<print $bodyParts.chest>> chest roughly<</if>>, taking her pleasure from your body. "Good boy," she purrs, moving faster. "Such a dedicated secretary..." You're just a toy for her relief. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She comes hard, crying out without caring who might hear. But she's not done. "Stand up. Take off your pants." When you comply, she sees your wet <<print $bodyParts.genitals>> and grins wickedly. "Oh, this is even better," she purrs. She pulls you down onto the couch with surprising strength. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She positions herself between your legs, fingers and tongue working your <<print $bodyParts.genitals>> with skill. Her nails rake down your thighs<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, one hand reaching up to grope your <<print $bodyParts.chest>> chest roughly<</if>>. "Good boy," she purrs against your sensitive flesh. "Such a dedicated secretary... with such a delicious surprise." She takes her pleasure from your body, making you come again and again until you're trembling. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🔥 Intimate Assistance</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I need you. Right now. Don't make me wait..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Assist.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Assisting the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor is already half-undressed when you enter, her need obvious. She practically attacks you, tearing at your clothes with desperate hands. "I've been thinking about you all morning," she pants, yanking your shirt off<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her eyes widen when she sees your <<print $bodyParts.chest>> chest. "Perfect," she gasps, hands immediately cupping them<</if>>. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your pants hit the floor and she's on her knees immediately, taking your <<print $bodyParts.genitals>> in her mouth. She sucks you hungrily, moaning around your length. Her hand works what doesn't fit, stroking and sucking until you're rock hard. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Bend me over the desk," she commands, standing. You comply, pushing her forward. She arches her back, presenting herself. "Fuck me hard. I need it rough." You grab her hips and thrust into her wet heat. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> You pound into her relentlessly, the desk shaking with each thrust. She screams your name, not caring who might hear. "Harder! Yes!" Her walls clench around you as she comes, but you keep going—giving her exactly what she demanded. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your pants hit the floor and she gasps when she sees your <<print $bodyParts.genitals>>. "Even better," she groans, pushing you back onto her desk. She spreads your legs wide, positioning herself between them. Her mouth descends on you hungrily, tongue and lips working you with desperate need. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "So wet for me," she moans against you. Her fingers push inside while her tongue works your most sensitive spots. She's relentless, making you writhe and buck against her face. "I need to taste you come." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She works you frantically, the desk creaking beneath you with each movement. You scream her name, not caring who might hear. "Yes! Don't stop!" Your body clenches around her fingers as you come, but she keeps going—giving you exactly what you both need, making you come again and again. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👔 Wardrobe Consultation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Help me choose an outfit. I value your... close opinion." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Wardrobe.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Wardrobe Consultation"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Wardrobe.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Wardrobe Consultation"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You follow the mayor into the private changing room adjacent to the office. It's intimate—just the two of you in close quarters. The mayor strips without hesitation, completely comfortable being naked in front of you. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "What do you think of this one?" Each outfit requires your hands-on assessment—smoothing fabric, adjusting fits, standing close enough to smell the mayor's cologne. The touches linger, become more deliberate. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Your turn. I need to see how you look." The mayor insists you try on clothing too, hands roaming as they "help" you change. Fingers trail over your skin, adjusting collars, smoothing wrinkles, finding excuses to touch. When your pants come off, the mayor's eyes linger on your <<print $bodyParts.genitals>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're pressed against the mirror, the mayor's body flush against yours, both of you hard and wanting. "I think we need to... test the durability," the mayor breathes, hand wrapping around both your cocks, stroking together. The consultation becomes something much more intimate. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Your turn. I need to see how you look." The mayor insists you try on clothing too, hands roaming as they "help" you change. Fingers trail over your skin, adjusting fabric, smoothing wrinkles, finding excuses to touch. When your pants come off, the mayor's eyes widen with surprise and delight at your <<print $bodyParts.genitals>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're pressed against the mirror, the mayor's body flush against yours. "What a delightful surprise," the mayor breathes, fingers already sliding between your legs, exploring your wetness. "I think we need to... test compatibility." The consultation becomes something much more intimate as the mayor's fingers work inside you. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💆 Private Massage Session</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm incredibly tense. Your hands... I need them on me." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massage Session"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massage Session"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor lies on the office couch, already shirtless. "Start with my shoulders." Your hands work into tense muscles, kneading and pressing. The mayor groans appreciatively, body relaxing under your touch. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Lower... yes, there." You work down the spine, and the mayor shifts, making room for you to reach better. Your position is intimate now—straddling the mayor's hips to get better leverage. You feel body heat through your clothes. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "The front needs attention too," the mayor says, rolling over beneath you. Now you're straddling a half-naked mayor who's looking up at you with obvious desire. "Don't stop..." Hands reach up, pulling you down. You can feel both of you hardening, cocks pressing together through fabric. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The massage becomes something else entirely. Lips meet in a heated kiss. Remaining clothes are torn away. Two bodies grinding together on the couch, hands everywhere, both your <<print $bodyParts.genitals>> hard and leaking, seeking pleasure rather than relaxation. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "The front needs attention too," the mayor says, rolling over beneath you. Now you're straddling a half-naked mayor who's looking up at you with obvious desire. "Don't stop..." Hands reach up, pulling you down, then sliding between your legs to discover your <<print $bodyParts.genitals>>. Eyes widen with surprise and hunger. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The massage becomes something else entirely. Lips meet in a heated kiss. Remaining clothes are torn away. The mayor flips you onto your back, settling between your legs, mouth descending to taste your wetness while fingers work inside you, seeking pleasure rather than relaxation. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💕 Personal Companionship</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I need more than just a secretary today. Keep me company. Close company." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Companion.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Companionship"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Companion.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Companionship"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor pulls you down onto the leather couch, uncomfortably close. An arm drapes around your shoulders, fingers playing with your <<print $appearance.hairColor.toLowerCase()>> hair. "You're more than just an employee to me," the mayor murmurs. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The touching becomes bolder—a hand on your thigh, sliding higher. The mayor leans in, breath hot against your neck. "I've wanted this for so long..." Lips brush your skin, testing your reaction. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> When you don't pull away, the mayor becomes more aggressive. You're pulled into a deep kiss, tongue invading your mouth. Hands roam over your body, claiming, exploring. "You're so <<if $physicalTraits.includes("Attractive")>>beautiful<<else>>perfect<</if>>," the mayor groans, hand finding your hardening <<print $bodyParts.genitals>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Clothes are stripped away piece by piece. The mayor's mouth trails down your body, hands everywhere at once. What started as companionship becomes raw need—two bodies moving together, cocks grinding, hands stroking, taking pleasure from each other without pretense. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> When you don't pull away, the mayor becomes more aggressive. You're pulled into a deep kiss, tongue invading your mouth. Hands roam over your body, claiming, exploring. When fingers slip between your legs and discover your <<print $bodyParts.genitals>>, the mayor gasps with delight. "Oh, this is perfect," the mayor breathes. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Clothes are stripped away piece by piece. The mayor's mouth trails down your body, settling between your spread legs. What started as companionship becomes raw need—tongue and fingers working you expertly, taking pleasure from making you moan and writhe without pretense. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👗 Fashion Review</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Model these outfits for me. I want to see how they look on someone... attractive." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Model.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Model.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The outfits grow progressively more revealing. What starts as formal wear devolves into barely-there clothing that shows far too much skin. You change in the private bathroom, emerging each time to the mayor's hungry stare. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Turn around. Slowly." The mayor circles you, eyes devouring every inch. Hands reach out, adjusting fabric—or so the excuse goes. Really, it's just an opportunity to touch your body, to feel your <<if $physicalTraits.includes("Fit")>>toned<<elseif $physicalTraits.includes("Soft")>>soft<</if>> skin. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> By the final "outfit"—lingerie that barely counts as clothing—the mayor's arousal is obvious, matching your own. "Perfect fit," the mayor breathes, pulling you close. Hands slide over the thin fabric, both your cocks straining visibly against the delicate material. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need a more thorough examination." The lingerie is stripped away, and you're pressed against the wall. The mayor's mouth is on yours, hands groping, wrapping around both your hardnesses, stroking together while grinding against you. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> By the final "outfit"—lingerie that barely counts as clothing—the mayor's arousal is obvious. "Perfect fit," the mayor breathes, pulling you close. Hands slide over the thin fabric, then beneath it, discovering your wet <<print $bodyParts.genitals>> with obvious delight. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need a more thorough examination." The lingerie is stripped away, and you're pressed against the wall. The mayor's mouth is on yours, hands groping, fingers pushing inside your heat while lips travel down your body to taste you directly. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🔒 Special Needs</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Lock the door. What I'm about to ask requires complete discretion..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.secretaryImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Needs.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Special Needs"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Needs.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Special Needs"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The door clicks locked. The mayor's eyes are dark with need, voice thick with desire. "I've been thinking about this all week." Hands grab you roughly, pulling you close. "About you. About us." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You're kissed hard, desperately. The mayor's hands are everywhere—tearing at your clothes, groping, claiming. "I need you naked. Now." There's no pretense anymore, no excuses. Just raw want. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Soon you're both stripped bare, bodies pressed together. The mayor pushes you down—onto the desk, the couch, the floor—it doesn't matter. What matters is skin on skin, mouths tasting, hands wrapping around both your hard cocks, stroking together in desperate rhythm. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The mayor takes you roughly, no holding back. Grinding, stroking, sucking—taking pleasure from every part of your body. It's intense, primal—two people giving in completely to forbidden desire. "Yes... god, yes..." The mayor's voice echoes in the office as pleasure consumes you both. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Soon you're both stripped bare, bodies pressed together. When the mayor's hands slide between your legs and discover your <<print $bodyParts.genitals>>, the gasp is one of pure hunger. "Even better than I imagined," the mayor groans, pushing you down—onto the desk, the couch, the floor—it doesn't matter. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The mayor devours you roughly, no holding back. Mouth, fingers, tongue—taking pleasure from every part of your body, making you writhe and scream. It's intense, primal—two people giving in completely to forbidden desire. "Yes... god, yes... so perfect..." The mayor's voice echoes in the office as pleasure consumes you both, making you come again and again. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize flags if they don't exist --> <<if !$acceptedEroticTask>> <<set $acceptedEroticTask = false>> <</if>> <<if !$refusedTask>> <<set $refusedTask = false>> <</if>> <!-- Ensure currentTask exists --> <<if !$currentTask>> <<set $currentTask = {pay: 30, desc: "complete miscellaneous office work"}>> <</if>> <!-- Lucky bonus money check --> <<set _bonusMoneyChance = 3>> <<if $mentalTraits.includes("Lucky")>> <<set _bonusMoneyChance = 10>> <<elseif $mentalTraits.includes("Unlucky")>> <<set _bonusMoneyChance = 0>> <</if>> <<set _bonusMoney = 0>> <<if random(1, 100) <= _bonusMoneyChance>> <<set _bonusMoney = random(50, 150)>> <<set $money += _bonusMoney>> <</if>> <!-- Trait gain system --> <<set _traitGained = false>> <<set _gainedTraitName = "">> <<set _replacedTrait = "">> <<set _isSkill = false>> <<if random(1, 100) <= 3>> <<if $acceptedEroticTask>> <!-- Erotic task trait pool --> <<set _eroticTraitPool = { physical: ["Graceful", "Fashionable"], mental: ["Customer-Focused", "Soft-Spoken", "Hushed Intimate Voice", "Loyal", "High Stamina", "Flirty", "Seductive", "Alluring", "Perfectionist", "Perverted", "Hardworking", "Quick Learner"], skills: ["Sexually Skilled", "Modeling", "Makeup"] }>> <!-- Flatten into single array with type info --> <<set _availableTraits = []>> <<for _pt range _eroticTraitPool.physical>> <<run _availableTraits.push({name: _pt, type: "physical"})>> <</for>> <<for _mt range _eroticTraitPool.mental>> <<run _availableTraits.push({name: _mt, type: "mental"})>> <</for>> <<for _st range _eroticTraitPool.skills>> <<run _availableTraits.push({name: _st, type: "skill"})>> <</for>> <<set _chosenTrait = _availableTraits.random()>> <<elseif !$refusedTask>> <!-- Regular task trait pool --> <<set _regularTraitPool = { mental: ["Perceptive", "Detail-Oriented", "Punctual", "Friendly Tone", "Clear Pronunciation", "Diplomatic", "Organized", "Resourceful", "Focused", "Determined", "Considerate", "Polite", "Reassuring", "Direct", "Efficient", "Workaholic", "Warm", "Logical", "Patient", "Intelligent", "Quick Learner"], skills: ["Public Speaking", "Accounting", "Customer Service"] }>> <!-- Flatten into single array with type info --> <<set _availableTraits = []>> <<for _mt range _regularTraitPool.mental>> <<run _availableTraits.push({name: _mt, type: "mental"})>> <</for>> <<for _st range _regularTraitPool.skills>> <<run _availableTraits.push({name: _st, type: "skill"})>> <</for>> <<set _chosenTrait = _availableTraits.random()>> <</if>> <!-- Process trait gain if one was selected --> <<if _chosenTrait>> <<if _chosenTrait.type === "skill">> <!-- Check if player already has this skill --> <<if !$skills.includes(_chosenTrait.name)>> <<run $skills.push(_chosenTrait.name)>> <<set _traitGained = true>> <<set _gainedTraitName = _chosenTrait.name>> <<set _isSkill = true>> <</if>> <<elseif _chosenTrait.type === "physical">> <!-- Check for conflicts in physical traits --> <<if !$physicalTraits.includes(_chosenTrait.name)>> <<set _conflict = setup.getConflictingTrait(_chosenTrait.name, $physicalTraits)>> <<if _conflict>> <<run $physicalTraits.delete(_conflict)>> <<set _replacedTrait = _conflict>> <</if>> <<run $physicalTraits.push(_chosenTrait.name)>> <<set _traitGained = true>> <<set _gainedTraitName = _chosenTrait.name>> <</if>> <<elseif _chosenTrait.type === "mental">> <!-- Check for conflicts in mental traits --> <<if !$mentalTraits.includes(_chosenTrait.name)>> <<set _conflict = setup.getConflictingTrait(_chosenTrait.name, $mentalTraits)>> <<if _conflict>> <<run $mentalTraits.delete(_conflict)>> <<set _replacedTrait = _conflict>> <</if>> <<run $mentalTraits.push(_chosenTrait.name)>> <<set _traitGained = true>> <<set _gainedTraitName = _chosenTrait.name>> <</if>> <</if>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">✓ Task Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> <<if $acceptedEroticTask>> You've fulfilled the mayor's request. The office door unlocks with a soft click as the mayor dismisses you with a satisfied smile. <<elseif $refusedTask>> You politely but firmly declined the mayor's request. The mayor looks disappointed but waves you away dismissively, handing you a reduced payment. <<else>> You complete the task efficiently and professionally. The mayor nods in approval, satisfied with your work. <</if>> </p> </div> <!-- Aftermath based on task type --> <<if $acceptedEroticTask>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #FFD700; margin-top: 0; text-align: center;">💋 Intimate Service Rendered</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> You straighten your clothes and catch your breath. The mayor is already back at work, as if nothing happened. But the knowing glances say otherwise. </p> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs && _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<if $relationships[_mayorName]>> <p style="color: #4dabf7; font-size: 14px; text-align: center; margin: 15px 0 0 0;"> Your relationship with <<print _mayorName>> has deepened. (Level <<print $relationships[_mayorName].level>>, <<print $relationships[_mayorName].points>> points) </p> <</if>> <</if>> </div> <<elseif $refusedTask>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin-top: 0; text-align: center;">✗ Request Declined</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> The atmosphere is awkward. The mayor clearly expected compliance. Your refusal has been noted, and the reduced payment reflects their displeasure. </p> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin-top: 0; text-align: center;">✓ Professional Task Completed</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> Another task done. The work is straightforward, if unremarkable. The mayor thanks you and returns to their paperwork. </p> </div> <</if>> <!-- Trait Gained Event --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 8px 16px rgba(81, 207, 102, 0.3); animation: glow 2s infinite;"> <h2 style="color: #51cf66; margin-top: 0; text-align: center;">✨ New <<if _isSkill>>Skill<<else>>Trait<</if>> Gained!</h2> <p style="color: #51cf66; font-size: 20px; text-align: center; margin: 0 0 10px 0; font-weight: bold;"> <<if _isSkill>>🎯<<elseif _chosenTrait.type === "physical">>💪<<else>>🧠<</if>> _gainedTraitName </p> <<if _replacedTrait !== "">> <p style="color: #ff6b6b; font-size: 14px; text-align: center; margin: 0 0 10px 0;"> (Replaced: _replacedTrait) </p> <</if>> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> <<if $acceptedEroticTask>> The intimate work is changing you in unexpected ways... <<else>> Your professional dedication is paying off! <</if>> </p> </div> <style> @keyframes glow { 0%, 100% { box-shadow: 0 8px 16px rgba(81, 207, 102, 0.3); } 50% { box-shadow: 0 8px 24px rgba(81, 207, 102, 0.6); } } </style> <</if>> <!-- Bonus Money Event --> <<if _bonusMoney > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 8px 16px rgba(255, 215, 0, 0.3); animation: pulse 2s infinite;"> <h2 style="color: #FFD700; margin-top: 0; text-align: center;">💰 Unexpected Bonus!</h2> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0 0 10px 0; font-weight: bold;"> +$<<print _bonusMoney>> </p> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> <<if $acceptedEroticTask>> "For going above and beyond," the mayor says with a wink, sliding extra cash across the desk. <<else>> "You've been doing excellent work lately," the mayor says, handing you extra money with a smile. <</if>> </p> <<if $mentalTraits.includes("Lucky")>> <p style="color: #ffc107; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> Your luck really pays off sometimes! </p> <</if>> </div> <style> @keyframes pulse { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 215, 0, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 215, 0, 0.6); } } </style> <</if>> <!-- Summary --> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin-top: 0; text-align: center;">Work Summary</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; text-align: center;"> <div> <p style="color: #aaa; margin: 0; font-size: 14px;">Time Worked</p> <p style="color: #fff; margin: 5px 0 0 0; font-size: 18px; font-weight: bold;">1 hour</p> </div> <div> <p style="color: #aaa; margin: 0; font-size: 14px;">Total Earned</p> <p style="color: #51cf66; margin: 5px 0 0 0; font-size: 18px; font-weight: bold;"> $<<print $currentTask.pay + _bonusMoney>> </p> </div> </div> </div> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Continue Working --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0; text-align: center;">🔄 Continue Working</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> See if the mayor has more tasks </p> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Keep Working</div>">> <<set $acceptedEroticTask = false>> <<set $refusedTask = false>> <<if $showWorkLimitNext>> <<set $showWorkLimitNext = false>> <<goto "SecretaryWorkLimitReached">> <<else>> <<goto "SecretarySpecialTasks">> <</if>> <</link>> </div> <!-- End Shift --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0; text-align: center;">🚪 End Shift</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Leave Town Hall for the day </p> <<link "<div style='background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave</div>">> <<set $acceptedEroticTask = false>> <<set $refusedTask = false>> <<goto "TownHall">> <</link>> </div> </div> <!-- Quick Navigation --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Secretary Work</div>">> <<set $acceptedEroticTask = false>> <<set $refusedTask = false>> <<goto "SecretaryWork">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="max-width: 700px; width: 100%;"> <div style="background: #2a1a1a; padding: 30px; border-radius: 15px; border: 3px solid #ff6b6b; box-shadow: 0 8px 16px rgba(255, 107, 107, 0.4);"> <h1 style="color: #ff6b6b; text-align: center; margin: 0 0 20px 0;">⚠️ Content Warning</h1> <div style="background: #1a1a1a; padding: 25px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <strong style="color: #ff6b6b;">Warning:</strong> The Mayor's Secretary job contains explicit adult content. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> This job involves sexual scenarios that may include: </p> <ul style="color: #aaa; font-size: 15px; line-height: 1.6; margin: 0 0 15px 20px;"> <li>Explicit sexual content and descriptions</li> <li>Workplace power dynamics</li> <li>Sexual harassment themes</li> <li>Adult situations across various gender combinations</li> <li>Coercion (with certain character traits)</li> </ul> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> This content is intended for mature audiences only. You can refuse inappropriate requests from the mayor, though this may affect your payment. </p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <!-- Continue --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #1a2a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✓ I Understand</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Continue to work </p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Proceed</div>">> <<set $hasSeenSecretaryWarning = true>> <<goto "SecretaryWork">> <</link>> </div> <!-- Go Back --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0; text-align: center;">✗ Go Back</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Return to Town Hall </p> <<link "<div style='background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave</div>">> <<goto "TownHall">> <</link>> </div> </div> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize secretary work hours if it doesn't exist --> <<if !$secretaryHoursWorkedToday>> <<set $secretaryHoursWorkedToday = 0>> <</if>> <!-- Initialize Sunfish counter if it doesn't exist --> <<if !$sunfishSightings>> <<set $sunfishSightings = 0>> <</if>> <!-- Get Mayor's Gender --> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<set _mayorGender = "unknown">> <<if _mayorNPCs.length > 0>> <<set _mayorGender = _mayorNPCs[0].bodyParts.gender>> <</if>> <!-- Calculate Attractiveness Score --> <<set _attractiveTraits = ["Attractive", "Curvy", "Voluptuous", "Charming", "Seductive", "Alluring", "Flirty", "Smooth Skin", "Youthful", "Graceful", "Fashionable", "Warm", "Charismatic Voice", "Smooth Voice"]>> <<set _masculineTraits = ["Muscular", "Broad-shouldered", "Strong", "Athletic Build", "Sturdy", "Jock", "Fit", "Lean"]>> <<set _feminineTraits = ["Curvy", "Voluptuous", "Soft", "Graceful", "Petite", "Youthful", "Smooth Skin"]>> <<set _attractivenessScore = 0>> <<set _masculinityScore = 0>> <<set _femininityScore = 0>> <<for _trait range _attractiveTraits>> <<if $physicalTraits.includes(_trait) || $mentalTraits.includes(_trait)>> <<set _attractivenessScore += 1>> <</if>> <</for>> <<for _trait range _masculineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _masculinityScore += 1>> <</if>> <</for>> <<for _trait range _feminineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _femininityScore += 1>> <</if>> <</for>> <!-- Chest size bonus for female player with male mayor --> <<set _chestBonus = 0>> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _chestSizes = ["flat", "small", "medium", "large", "huge", "giant"]>> <<set _chestIndex = _chestSizes.indexOf($bodyParts.chest.toLowerCase())>> <<if _chestIndex >= 0>> <<set _chestBonus = _chestIndex * 5>> <</if>> <</if>> <!-- Calculate base erotic task chance --> <<set _eroticChance = 20>> <!-- Gender-based modifiers --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticChance += (_attractivenessScore * 5) + (_femininityScore * 5) + _chestBonus>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticChance += (_attractivenessScore * 5) + (_masculinityScore * 8)>> <<elseif $bodyParts.gender === _mayorGender>> <!-- Same gender - requires high attractiveness + specific traits --> <<if $bodyParts.gender === "male" && $mentalTraits.includes("Femboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<elseif $bodyParts.gender === "female" && $mentalTraits.includes("Tomboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<else>> <<set _eroticChance = 0>> <</if>> <</if>> <!-- Cap at 85% --> <<if _eroticChance > 85>> <<set _eroticChance = 85>> <</if>> <!-- Determine task type --> <<set _taskRoll = random(1, 100)>> <<set _isEroticTask = _taskRoll <= _eroticChance>> <!-- Check for Sunfish trait event (1% chance) --> <<set _sunfishEvent = false>> <<if $skills.includes("Sunfish") && random(1, 100) === 1>> <<set _sunfishEvent = true>> <<set $sunfishSightings += 1>> <</if>> <!-- Check if going to The Alter --> <<if $sunfishSightings >= 10>> <<goto "TheAlter">> <</if>> <!-- Advance time (always 60 minutes per task) and increment work hours --> <<run window.advanceTime(60)>> <<set $secretaryHoursWorkedToday += 1>> <!-- Check if now at limit after incrementing --> <<if $secretaryHoursWorkedToday >= 8>> <<set $hitWorkLimit = true>> <</if>> <!-- Calculate erotic payment based on traits (75-250) --> <<set _traitPaymentScore = _attractivenessScore + _masculinityScore + _femininityScore + (_chestBonus / 5)>> <<set _eroticPay = Math.floor(75 + (_traitPaymentScore * 12))>> <<if _eroticPay > 250>> <<set _eroticPay = 250>> <</if>> <!-- Generate Task --> <<if !_isEroticTask>> <!-- NORMAL TASK --> <<set _normalTasks = [ {desc: "File paperwork and organize the mayor's schedule", pay: 30}, {desc: "Answer phone calls and respond to emails", pay: 25}, {desc: "Prepare meeting notes and agendas", pay: 35}, {desc: "Coordinate with other city departments", pay: 40}, {desc: "Review and proofread city documents", pay: 30}, {desc: "Manage the mayor's calendar and appointments", pay: 35}, {desc: "Order office supplies and maintain inventory", pay: 25}, {desc: "Greet visitors and direct them appropriately", pay: 30} ]>> <<set _task = _normalTasks.random()>> <<set _taskType = "normal">> <<else>> <!-- EROTIC TASK --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticTasks = [ {desc: "sit on the mayor's lap during a 'private meeting'", pay: _eroticPay, passage: "SecretaryEroticLap"}, {desc: "massage the mayor's shoulders while he works", pay: _eroticPay, passage: "SecretaryEroticMassage"}, {desc: "wear a more 'professional' outfit the mayor has selected", pay: _eroticPay, passage: "SecretaryEroticOutfit"}, {desc: "take dictation while sitting very close to the mayor", pay: _eroticPay, passage: "SecretaryEroticDictation"}, {desc: "help the mayor 'relieve stress' under his desk", pay: _eroticPay, passage: "SecretaryEroticDesk"}, {desc: "model the new 'city uniform' for the mayor's approval", pay: _eroticPay, passage: "SecretaryEroticModel"}, {desc: "give the mayor a 'special presentation' behind closed doors", pay: _eroticPay, passage: "SecretaryEroticPresentation"} ]>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticTasks = [ {desc: "let the mayor admire your physique during a 'fitness consultation'", pay: _eroticPay, passage: "SecretaryEroticPhysique"}, {desc: "assist the mayor with 'personal stress relief'", pay: _eroticPay, passage: "SecretaryEroticRelief"}, {desc: "provide the mayor with a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageFemale"}, {desc: "model swimwear for the mayor's 'aquatics initiative review'", pay: _eroticPay, passage: "SecretaryEroticSwimwear"}, {desc: "help the mayor with 'personal satisfaction' in her private office", pay: _eroticPay, passage: "SecretaryEroticSatisfaction"}, {desc: "demonstrate your strength by lifting the mayor", pay: _eroticPay, passage: "SecretaryEroticLift"}, {desc: "provide 'intimate assistance' as requested", pay: _eroticPay, passage: "SecretaryEroticAssist"} ]>> <<else>> <!-- Same gender tasks --> <<set _eroticTasks = [ {desc: "help the mayor with a 'private wardrobe consultation'", pay: _eroticPay, passage: "SecretaryEroticWardrobe"}, {desc: "provide the mayor with 'personal companionship'", pay: _eroticPay, passage: "SecretaryEroticCompanion"}, {desc: "give the mayor a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageSame"}, {desc: "model clothing for the mayor's review", pay: _eroticPay, passage: "SecretaryEroticModelSame"}, {desc: "assist with the mayor's 'special needs'", pay: _eroticPay, passage: "SecretaryEroticNeeds"} ]>> <</if>> <<set _task = _eroticTasks.random()>> <<set _taskType = "erotic">> <</if>> <!-- Store task info globally for sub-passages --> <<set $currentTask = _task>> <<set $currentTaskType = _taskType>> <!-- Check for forced acceptance (Bimbo/Submissive) --> <<set _canRefuse = true>> <<set _forceAcceptChance = 0>> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 75>> <<elseif $mentalTraits.includes("Bimbo") || $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 50>> <</if>> <<set _forcedAcceptance = false>> <<if _forceAcceptChance > 0 && random(1, 100) <= _forceAcceptChance>> <<set _forcedAcceptance = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">✨ Special Assignment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> You enter the mayor's private office. The door closes behind you with a soft click. </p> </div> <!-- Sunfish Event --> <<if _sunfishEvent>> <div style="background: #1a3a4a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a9eff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> For a brief moment, you catch a glimpse of something in your peripheral vision - a shadowy figure that appears to be made of several sunfish stacked in a trench coat. When you turn to look, there's nothing there. Just an empty corner of the office. </p> <p style="color: #74c0fc; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> (Strange sightings: $sunfishSightings/10) </p> </div> <</if>> <!-- Hours Worked Display --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 25px; border: 2px solid <<if $secretaryHoursWorkedToday >= 7>>#ffc107<<else>>#4dabf7<</if>>;"> <p style="color: <<if $secretaryHoursWorkedToday >= 7>>#ffc107<<else>>#4dabf7<</if>>; font-size: 16px; text-align: center; margin: 0;"> Hours Worked Today: <strong>$secretaryHoursWorkedToday/8</strong> </p> <<if $secretaryHoursWorkedToday >= 7>> <p style="color: #ffc107; font-size: 13px; text-align: center; margin: 5px 0 0 0; font-style: italic;"> Almost at your daily limit! </p> <</if>> </div> <!-- Task Description --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; margin-top: 0;">The Mayor's Request</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#666<</if>>;"> <p style="color: #ccc; font-size: 16px; margin: 0;"> The mayor asks you to <strong style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>;"><<print _task.desc>></strong>. </p> <<if _taskType === "erotic">> <p style="color: #ffc107; font-size: 14px; margin: 15px 0 0 0; font-style: italic;"> This definitely wasn't in your job description... </p> <</if>> </div> <div style="margin-top: 20px; padding: 15px; background: #1a1a1a; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0;"> Payment: <strong>$<<print _task.pay>></strong> </p> <<if _taskType === "erotic">> <p style="color: #ff6b6b; font-size: 14px; margin: 5px 0 0 0;"> Refusing will result in reduced pay ($<<print Math.floor(_task.pay * 0.3)>>) </p> <</if>> </div> </div> <!-- Decision Options --> <<if _forcedAcceptance && _taskType === "erotic">> <!-- Forced Acceptance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ff6b6b; font-size: 16px; text-align: center; margin: 0 0 15px 0; font-style: italic;"> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> Your submissive nature and scattered thoughts make it impossible to refuse. You find yourself nodding automatically. <<else>> Something about the request makes you unable to say no. Your body moves on its own. <</if>> </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Comply</div>">> <<set $acceptedEroticTask = true>> <<goto _task.passage>> <</link>> </div> <<else>> <!-- Normal Choice --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Accept --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✓ Accept</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Do as the mayor requests </p> <<if _taskType === "erotic">> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <<set $acceptedEroticTask = true>> <<goto _task.passage>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <<set $money += _task.pay>> <<set $acceptedEroticTask = false>> <<goto "SecretaryTaskResult">> <</link>> <</if>> </div> <!-- Refuse --> <<if _taskType === "erotic">> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">✗ Refuse</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Politely decline </p> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Refuse Task</div>">> <<set $money += Math.floor(_task.pay * 0.3)>> <<set $acceptedEroticTask = false>> <<set $refusedTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> <</if>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> </div> <!-- If hit limit during this task, show limit message on next return --> <<if $hitWorkLimit>> <<set $showWorkLimitNext = true>> <<set $hitWorkLimit = false>> <</if>> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">⏰ Daily Work Limit Reached</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> You've already worked 8 hours today as the mayor's secretary. That's enough for one day. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0; line-height: 1.6;"> The mayor waves you away. "You've done plenty today. Go home and rest. I'll see you tomorrow." </p> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #4dabf7;"> <p style="color: #4dabf7; font-size: 16px; text-align: center; margin: 0;"> Hours Worked Today: <strong>$secretaryHoursWorkedToday/8</strong> </p> <p style="color: #888; font-size: 14px; text-align: center; margin: 10px 0 0 0;"> Come back tomorrow for more work. </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Town Hall</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _relColor = "#667eea">> <!-- Password Check --> <<if !$cheatMenuUnlocked>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 15px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); max-width: 500px; text-align: center;"> <h1 style="color: #667eea; margin: 0 0 20px 0;">🔒 Cheat Menu Access</h1> <div style="background-color: #0a0a0a; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ffd43b;"> <p style="color: #ffd43b; font-size: 18px; font-weight: bold; margin: 0;">⭐ Patreon Tiers Spoon and up can access the cheat menu! ⭐</p> </div> <p style="color: #e0e0e0; margin-bottom: 20px; font-size: 16px;">Enter the password to continue:</p> <div style="margin-bottom: 20px;"> <<textbox "_cheatPassword" "" "autofocus">> </div> <span id="passwordError" style="color: #ff6b6b; font-size: 14px; display: none; margin-bottom: 15px;">❌ Incorrect password. Please try again.</span> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px 30px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: inline-block; margin-top: 10px;'>Unlock</div>">> <<set _correctPassword = "">> /* Are you really using inspect element to find the password? smh. */ <<if _cheatPassword === _correctPassword>> <<set $cheatMenuUnlocked = true>> <<goto "Debug">> <<else>> <<run $("#passwordError").show()>> <</if>> <</link>> <div style="margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 10px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: inline-block;'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Return to game</div>">> <<goto $lastLocation>> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _relColor>> 0%, <<= _relColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _relColor>>; box-shadow: 0 0 20px <<= _relColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">⚙️ Cheat Menu</h1> </div> <span id="cheatMenuContent"> <!-- Time & Date Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">⏰ Time & Date</h2> <!-- Current Time Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; color: #e0e0e0; font-size: 15px;"> <div> <strong style="color: #4dabf7;">Current Time:</strong><br> <span id="currentTime" style="color: #51cf66; font-size: 18px; font-weight: bold;"><<= getTimeString()>></span> </div> <div> <strong style="color: #4dabf7;">Date:</strong><br> <span id="currentDate" style="color: #ffd43b; font-size: 18px; font-weight: bold;">$dayOfWeek, Day $dayNumber</span> </div> </div> </div> <!-- Quick Time Adjustments --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Quick Time Adjustments</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+30 Minutes</div>">> <<run window.advanceTime(30)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1 Hour</div>">> <<run window.advanceTime(60)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> </div> </div> <!-- Set Specific Time --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Set Specific Time</h3> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>6 AM</div>">> <<set $timeInMinutes = 360>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>9 AM</div>">> <<set $timeInMinutes = 540>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>12 PM</div>">> <<set $timeInMinutes = 720>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #ff6b6b 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>3 PM</div>">> <<set $timeInMinutes = 900>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #ff6b6b 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>6 PM</div>">> <<set $timeInMinutes = 1080>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>10 PM</div>">> <<set $timeInMinutes = 1320>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> <!-- Day Controls --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Day Controls</h3> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Next Day (8 AM)</div>">> <<set $dayNumber += 1>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<set _nextDayIndex = (_currentDayIndex + 1) % 7>> <<set $dayOfWeek = $dayOrder[_nextDayIndex]>> <<if $dayOfWeek === "Monday">> <<set $weekNumber += 1>> <</if>> <<set $timeInMinutes = 480>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <<set $mayorHoursWorkedToday = 0>> <!-- Mayor salary refresh on Monday --> <<if $dayOfWeek === "Monday" && $jobs && $jobs.includes("City Mayor")>> <<if !$lastMayorSalaryRefresh>><<set $lastMayorSalaryRefresh = -1>><</if>> <<if !$mayorWeeklySalaryAvailable>><<set $mayorWeeklySalaryAvailable = 0>><</if>> <<if $lastMayorSalaryRefresh !== $dayNumber>> <<set $mayorWeeklySalaryAvailable = 1000>> <<set $lastMayorSalaryRefresh = $dayNumber>> <</if>> <</if>> <!-- Decrement daily counters --> <<if $wifiDaysRemaining && $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 1>> <</if>> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<set $busPassDaysRemaining -= 1>> <</if>> <<if $rentDaysRemaining && $rentDaysRemaining > 0>> <<set $rentDaysRemaining -= 1>> <<if $rentDaysRemaining <= 0 && $hasApartment>> <<set $hasApartment = false>> <<set $homeless = true>> <<set $wasEvicted = true>> <</if>> <</if>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #da77f2 0%, #cc5de8 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Next Week (Monday 8 AM)</div>">> <<set $weekNumber += 1>> <<set $dayOfWeek = "Monday">> <<set $dayNumber += 7>> <<set $timeInMinutes = 480>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <<set $mayorHoursWorkedToday = 0>> <!-- Mayor salary refresh (always Monday) --> <<if $jobs && $jobs.includes("City Mayor")>> <<if !$lastMayorSalaryRefresh>><<set $lastMayorSalaryRefresh = -1>><</if>> <<if !$mayorWeeklySalaryAvailable>><<set $mayorWeeklySalaryAvailable = 0>><</if>> <<if $lastMayorSalaryRefresh !== $dayNumber>> <<set $mayorWeeklySalaryAvailable = 1000>> <<set $lastMayorSalaryRefresh = $dayNumber>> <</if>> <</if>> <!-- Decrement daily counters for 7 days --> <<if $wifiDaysRemaining && $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 7>> <<if $wifiDaysRemaining < 0>><<set $wifiDaysRemaining = 0>><</if>> <</if>> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<set $busPassDaysRemaining -= 7>> <<if $busPassDaysRemaining < 0>><<set $busPassDaysRemaining = 0>><</if>> <</if>> <<if $rentDaysRemaining && $rentDaysRemaining > 0>> <<set $rentDaysRemaining -= 7>> <<if $rentDaysRemaining <= 0 && $hasApartment>> <<set $hasApartment = false>> <<set $homeless = true>> <<set $wasEvicted = true>> <</if>> <</if>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> </div> <!-- Money Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">💰 Money</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 18px; margin: 0 0 15px 0;"> <strong>Current Money:</strong> <span id="currentMoney" style="color: #51cf66;">$<<= $money.toLocaleString()>></span> </p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$50,000</div>">> <<set $money += 50000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to $100,000</div>">> <<set $money = 100000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to $0</div>">> <<set $money = 0>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> </div> <!-- Stats Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">📊 Stats</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Strength --> <div> <p style="color: #ff6b6b; margin: 0 0 8px 0; font-weight: bold;">■ Strength: <span id="statStrength"><<= setup.getTotalStat("strength")>></span></p> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.strength = 99>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> </div> <!-- Dexterity --> <div> <p style="color: #51cf66; margin: 0 0 8px 0; font-weight: bold;">■ Dexterity: <span id="statDexterity"><<= setup.getTotalStat("dexterity")>></span></p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.dexterity = 99>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> </div> <!-- Charisma --> <div> <p style="color: #ffd43b; margin: 0 0 8px 0; font-weight: bold;">■ Charisma: <span id="statCharisma"><<= setup.getTotalStat("charisma")>></span></p> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.charisma = 99>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> </div> <!-- Intelligence --> <div> <p style="color: #4dabf7; margin: 0 0 8px 0; font-weight: bold;">■ Intelligence: <span id="statIntelligence"><<= setup.getTotalStat("intelligence")>></span></p> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.intelligence = 99>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> </div> </div> </div> </div> <!-- Body Parts Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">👤 Body & Appearance</h2> <!-- Gender --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Gender: <span id="currentGender" style="color: #e0e0e0;"><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #c92a2a 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Female</div>">> <<set $bodyParts.gender = "female">> <<replace "#currentGender">><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #1971c2 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Male</div>">> <<set $bodyParts.gender = "male">> <<replace "#currentGender">><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>><</replace>> <</link>> </div> </div> <!-- Chest Size --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Chest Size: <span id="currentChest" style="color: #e0e0e0;"><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #868e96 0%, #495057 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat Masculine</div>">> <<set $bodyParts.chest = "flat masculine">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #868e96 0%, #495057 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat</div>">> <<set $bodyParts.chest = "flat">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #a9d5de 0%, #74c0fc 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small</div>">> <<set $bodyParts.chest = "small">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #91a7ff 0%, #748ffc 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Medium</div>">> <<set $bodyParts.chest = "medium">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #da77f2 0%, #cc5de8 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Large</div>">> <<set $bodyParts.chest = "large">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Huge</div>">> <<set $bodyParts.chest = "huge">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #ff6b6b 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Giant</div>">> <<set $bodyParts.chest = "giant">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> </div> </div> <!-- Butt Size --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Butt Size: <span id="currentButt" style="color: #e0e0e0;"><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #868e96 0%, #495057 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat Masculine</div>">> <<set $bodyParts.butt = "flat masculine">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #868e96 0%, #495057 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat</div>">> <<set $bodyParts.butt = "flat">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #a9d5de 0%, #74c0fc 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small</div>">> <<set $bodyParts.butt = "small">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #91a7ff 0%, #748ffc 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Medium</div>">> <<set $bodyParts.butt = "medium">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #da77f2 0%, #cc5de8 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Large</div>">> <<set $bodyParts.butt = "large">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Huge</div>">> <<set $bodyParts.butt = "huge">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #ff6b6b 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Giant</div>">> <<set $bodyParts.butt = "giant">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> </div> </div> <!-- Skin Tone --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Skin Tone: <span id="currentSkinTone" style="color: #e0e0e0;"><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ffe8cc 0%, #ffd8a8 100%); color: #333; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Pale</div>">> <<set $appearance.skinTone = "pale">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #d9b99b 0%, #b7856a 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Tan</div>">> <<set $appearance.skinTone = "tan">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #8d6e63 0%, #5d4037 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Dark</div>">> <<set $appearance.skinTone = "dark">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> </div> </div> <!-- Hair Color --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Color: <span id="currentHairColor" style="color: #e0e0e0;"><<= $appearance.hairColor>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #212529 0%, #000000 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Black</div>">> <<set $appearance.hairColor = "Black">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Brown</div>">> <<set $appearance.hairColor = "Brown">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffe066 0%, #ffd43b 100%); color: #333; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Blonde</div>">> <<set $appearance.hairColor = "Blonde">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Red</div>">> <<set $appearance.hairColor = "Red">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #f1f3f5 0%, #dee2e6 100%); color: #333; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Platinum</div>">> <<set $appearance.hairColor = "Platinum Blonde">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> </div> </div> <!-- Hair Length --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Length: <span id="currentHairLength" style="color: #e0e0e0;"><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #748ffc 0%, #5c7cfa 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Short</div>">> <<set $appearance.hairLength = "short">> <<if $physicalTraits.includes("Long Hair")>> <<run $physicalTraits.delete("Long Hair")>> <</if>> <<if !$physicalTraits.includes("Short Hair")>> <<run $physicalTraits.push("Short Hair")>> <</if>> <<replace "#currentHairLength">><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #da77f2 0%, #cc5de8 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Long</div>">> <<set $appearance.hairLength = "long">> <<if $physicalTraits.includes("Short Hair")>> <<run $physicalTraits.delete("Short Hair")>> <</if>> <<if !$physicalTraits.includes("Long Hair")>> <<run $physicalTraits.push("Long Hair")>> <</if>> <<replace "#currentHairLength">><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>><</replace>> <</link>> </div> </div> <!-- Age --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Age: <span id="currentAge" style="color: #e0e0e0;"><<= $appearance.age>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Adult</div>">> <<set $appearance.age = "Adult">> <<replace "#currentAge">><<= $appearance.age>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #868e96 0%, #495057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Mature Adult</div>">> <<set $appearance.age = "Mature Adult">> <<replace "#currentAge">><<= $appearance.age>><</replace>> <</link>> </div> </div> <!-- Name --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Name: <span id="currentName" style="color: #e0e0e0;"><<= $firstName>> <<= $lastName>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <div> <label style="color: #aaa; font-size: 14px; display: block; margin-bottom: 5px;">First Name:</label> <<textbox "_newFirstName" $firstName>> </div> <div> <label style="color: #aaa; font-size: 14px; display: block; margin-bottom: 5px;">Last Name:</label> <<textbox "_newLastName" $lastName>> </div> </div> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Update Name</div>">> <<if _newFirstName && _newFirstName.trim() !== "">> <<set $firstName = _newFirstName.trim()>> <</if>> <<if _newLastName && _newLastName.trim() !== "">> <<set $lastName = _newLastName.trim()>> <</if>> <<replace "#currentName">><<= $firstName>> <<= $lastName>><</replace>> <</link>> </div> </div> <!-- Housing & Tech Items Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">🏠 Housing & Tech Items</h2> <!-- Apartment Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Apartment Status</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #4dabf7;">Status:</strong> <span id="apartmentStatus"> <<if $hasApartment>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <br><strong style="color: #4dabf7;">Rent Days Remaining:</strong> <span id="rentDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $rentDaysRemaining || 0>></span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Apartment</div>">> <<set $hasApartment = true>> <<set $rentDaysRemaining = 90>> <<set $homeless = false>> <<replace "#apartmentStatus">> <<if $hasApartment>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <br><strong style="color: #4dabf7;">Rent Days Remaining:</strong> <span id="rentDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $rentDaysRemaining || 0>></span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Rent to 90 Days</div>">> <<set $rentDaysRemaining = 90>> <<replace "#rentDaysDisplay">><<print $rentDaysRemaining || 0>><</replace>> <</link>> </div> </div> <!-- Tech Items --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Tech Store Items</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <!-- Laptop --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #17a2b8;">💻 Laptop:</strong> <span id="laptopStatus"> <<if $hasLaptop>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Laptop</div>">> <<set $hasLaptop = true>> <<replace "#laptopStatus">> <<if $hasLaptop>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- TV --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #667eea;">📺 TV:</strong> <span id="tvStatus"> <<if $hasTV>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add TV</div>">> <<set $hasTV = true>> <<replace "#tvStatus">> <<if $hasTV>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Router --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #f39c12;">📡 Router:</strong> <span id="routerStatus"> <<if $hasRouter>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Router</div>">> <<set $hasRouter = true>> <<replace "#routerStatus">> <<if $hasRouter>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Webcam --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #e74c3c;">📷 Webcam:</strong> <span id="webcamStatus"> <<if $hasWebcam>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Webcam</div>">> <<set $hasWebcam = true>> <<replace "#webcamStatus">> <<if $hasWebcam>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Add All Tech Items Button --> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Tech Items</div>">> <<set $hasLaptop = true>> <<set $hasTV = true>> <<set $hasRouter = true>> <<set $hasWebcam = true>> <<replace "#laptopStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#tvStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#routerStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#webcamStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <</link>> </div> <!-- WiFi Service --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">WiFi Service</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #4dabf7;">WiFi Setup:</strong> <span id="wifiSetupStatus"> <<if $wifiSetupComplete>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Complete</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Setup</span> <</if>> </span> <br> <strong style="color: #4dabf7;">Service Days:</strong> <span id="wifiDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $wifiDaysRemaining || 0>></span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Complete WiFi Setup</div>">> <<set $wifiSetupComplete = true>> <<replace "#wifiSetupStatus">> <<if $wifiSetupComplete>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Complete</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Setup</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set WiFi to 90 Days</div>">> <<set $wifiDaysRemaining = 90>> <<replace "#wifiDaysDisplay">><<print $wifiDaysRemaining || 0>><</replace>> <</link>> </div> </div> </div> <!-- Music Equipment & Streaming Skills Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6347; margin: 0 0 15px 0;">🎵 Music Equipment & Streaming Skills</h2> <!-- Music Equipment --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">Music Equipment</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <!-- Guitar --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🎸 Guitar:</strong> <span id="guitarStatus"> <<if $ownsGuitar>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Guitar</div>">> <<set $ownsGuitar = true>> <<replace "#guitarStatus">> <<if $ownsGuitar>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Electric Piano --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🎹 Electric Piano:</strong> <span id="pianoStatus"> <<if $ownsElectricPiano>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Piano</div>">> <<set $ownsElectricPiano = true>> <<replace "#pianoStatus">> <<if $ownsElectricPiano>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Microphone --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🎤 Microphone:</strong> <span id="micStatus"> <<if $ownsMicrophone>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Microphone</div>">> <<set $ownsMicrophone = true>> <<replace "#micStatus">> <<if $ownsMicrophone>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Speakers --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🔊 Speakers:</strong> <span id="speakersStatus"> <<if $ownsSpeakers>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Speakers</div>">> <<set $ownsSpeakers = true>> <<replace "#speakersStatus">> <<if $ownsSpeakers>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Add All Music Equipment Button --> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Music Equipment</div>">> <<set $ownsGuitar = true>> <<set $ownsElectricPiano = true>> <<set $ownsMicrophone = true>> <<set $ownsSpeakers = true>> <<replace "#guitarStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#pianoStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#micStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#speakersStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <</link>> </div> <!-- Streaming Skills --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Essential Streaming Skills</h3> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Singing</div>">> <<if !$skills.includes("Singing")>> <<set $skills.push("Singing")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Guitar</div>">> <<if !$skills.includes("Guitar")>> <<set $skills.push("Guitar")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Piano</div>">> <<if !$skills.includes("Piano")>> <<set $skills.push("Piano")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Makeup</div>">> <<if !$skills.includes("Makeup")>> <<set $skills.push("Makeup")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Hair Styling</div>">> <<if !$skills.includes("Hair Styling")>> <<set $skills.push("Hair Styling")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Gaming</div>">> <<if !$skills.includes("Gaming")>> <<set $skills.push("Gaming")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Dancing</div>">> <<if !$skills.includes("Dancing")>> <<set $skills.push("Dancing")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Social Media</div>">> <<if !$skills.includes("Social Media")>> <<set $skills.push("Social Media")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Cooking</div>">> <<if !$skills.includes("Cooking")>> <<set $skills.push("Cooking")>> <</if>> <<goto "Debug">> <</link>> <<link "<div style='background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>Add Baking</div>">> <<if !$skills.includes("Baking")>> <<set $skills.push("Baking")>> <</if>> <<goto "Debug">> <</link>> </div> <!-- Add All Streaming Skills Button --> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Streaming Skills</div>">> <<if !$skills.includes("Singing")>><<set $skills.push("Singing")>><</if>> <<if !$skills.includes("Guitar")>><<set $skills.push("Guitar")>><</if>> <<if !$skills.includes("Piano")>><<set $skills.push("Piano")>><</if>> <<if !$skills.includes("Makeup")>><<set $skills.push("Makeup")>><</if>> <<if !$skills.includes("Hair Styling")>><<set $skills.push("Hair Styling")>><</if>> <<if !$skills.includes("Cooking")>><<set $skills.push("Cooking")>><</if>> <<if !$skills.includes("Baking")>><<set $skills.push("Baking")>><</if>> <<if !$skills.includes("Gaming")>><<set $skills.push("Gaming")>><</if>> <<if !$skills.includes("Dancing")>><<set $skills.push("Dancing")>><</if>> <<if !$skills.includes("Art")>><<set $skills.push("Art")>><</if>> <<if !$skills.includes("Social Media")>><<set $skills.push("Social Media")>><</if>> <<goto "Debug">> <</link>> </div> </div> <span id="streamingSection"> <<include "CheatMenuStreaming">> </span> <!-- PrawnHub Section --> <div id="prawnhubSection"> <<include "CheatMenuPrawnHub">> </div> <!-- Job Management Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">💼 Job Management</h2> <!-- Current Job Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Current Job:</h3> <span id="currentJob"> <<if $jobs && $jobs.length > 0>> <span style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print $jobs[0]>></span> <<else>> <span style="color: #ff6b6b; font-size: 18px; font-weight: bold;">Unemployed</span> <</if>> </span> </div> <!-- Job Selection --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Change Job:</h3> <select id="replaceJob" style="width: 100%; padding: 12px; background: #0a0a0a; color: #fff; border: 2px solid #667eea; border-radius: 8px; margin-bottom: 15px; font-size: 15px; cursor: pointer;"> <option value="">-- Select Job --</option> <option value="Unemployed">Unemployed</option> <option value="Street Performer">Street Performer</option> <option value="Package Courier">Package Courier</option> <option value="Construction Worker">Construction Worker</option> <option value="Dock Worker">Dock Worker</option> <option value="Security Guard">Security Guard</option> <option value="Baker">Baker</option> <option value="Maid">Maid</option> <option value="Hooker">Hooker</option> <option value="Stripper">Stripper</option> <option value="Prostitute">Prostitute</option> <option value="Fitness Shop Clerk">Fitness Shop Clerk</option> <option value="Ecentric Shop Worker">Ecentric Shop Worker</option> <option value="Tech Store Clerk">Tech Store Clerk</option> <option value="Adult Store Clerk">Adult Store Clerk</option> <option value="Beauty Salon Stylist">Beauty Salon Stylist</option> <option value="Brothel Worker">Brothel Worker</option> <option value="Model">Model</option> <option value="Bouncer">Bouncer</option> <option value="Clinic Assistant">Clinic Assistant</option> <option value="Data Analyst">Data Analyst</option> <option value="Negotiator">Negotiator</option> <option value="Enforcer">Enforcer</option> <option value="Porn Star">Porn Star</option> <option value="Social Media Influencer">Social Media Influencer</option> <option value="Black Market Dealer">Black Market Dealer</option> <option value="Police Officer">Police Officer</option> <option value="Brothel Owner">Brothel Owner</option> <option value="Mayor's Secretary">Mayor's Secretary</option> <option value="City Mayor">City Mayor</option> <option value="Fitness Trainer">Fitness Trainer</option> <option value="Streamer">Streamer</option> </select> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Apply Job Change</div>">> <<set _selectedJob = jQuery("#replaceJob").val()>> <<if _selectedJob && _selectedJob !== "">> <<if _selectedJob === "Unemployed">> <<set $jobs = []>> <<set $homeless = true>> <<else>> <<set $jobs = [_selectedJob]>> <<set $homeless = false>> /* Update stats to meet job requirements */ <<set _jobReqs = setup.jobRequirements[_selectedJob] || {}>> <<for _stat, _minValue range _jobReqs>> <<if $stats[_stat] < _minValue>> <<set $stats[_stat] = _minValue>> <</if>> <</for>> <</if>> <<replace "#currentJob">> <<if $jobs && $jobs.length > 0>> <span style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print $jobs[0]>></span> <<else>> <span style="color: #ff6b6b; font-size: 18px; font-weight: bold;">Unemployed</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</if>> <</link>> </div> </div> <!-- Special Skills Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6b9d; margin: 0 0 15px 0;">🧪 Special Skills</h2> <!-- BtestBraitBeesBigBeenore --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">BtestBraitBeesBigBeenore</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Ultimate power skill with 999 trade value and +90 to all stats</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="btestStatus"> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$skills.includes("BtestBraitBeesBigBeenore")>> <<run $skills.push("BtestBraitBeesBigBeenore")>> <</if>> <<replace "#btestStatus">> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <<run $skills.delete("BtestBraitBeesBigBeenore")>> <</if>> <<replace "#btestStatus">> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> </div> </div> <!-- Were-Creature --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Were-Creature</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Powerful transformation skill with 450 trade value and +60 Strength/Dexterity</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="wereStatus"> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$physicalTraits.includes("Were-Creature")>> <<run $physicalTraits.push("Were-Creature")>> <</if>> <<replace "#wereStatus">> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $physicalTraits.includes("Were-Creature")>> <<run $physicalTraits.delete("Were-Creature")>> <</if>> <<replace "#wereStatus">> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> </div> </div> <!-- Sunfish --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Sunfish</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Legendary aquatic skill with 500 trade value and +50 to all stats</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="sunfishStatus"> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$skills.includes("Sunfish")>> <<run $skills.push("Sunfish")>> <</if>> <<replace "#sunfishStatus">> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $skills.includes("Sunfish")>> <<run $skills.delete("Sunfish")>> <</if>> <<replace "#sunfishStatus">> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> </div> </div> </div> <!-- NPC Relationship Management Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #e91e63; margin: 0 0 15px 0;">💕 NPC Relationship Management</h2> <span id="relationshipsSection"> <<include "CheatMenuRelationships">> </span> </div> <!-- Physical Traits Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💪 Physical Traits</h2> <!-- Current Physical Traits --> <span id="physicalTraitsSection"> <<include "CheatMenuPhysicalTraits">> </span> </div> <!-- Voice Traits Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #da77f2; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #da77f2; margin: 0 0 15px 0;">🎤 Voice Trait</h2> <span id="voiceTraitsSection"> <<include "CheatMenuVoiceTraits">> </span> </div> <!-- Mental Traits Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">🧠 Mental Traits</h2> <span id="mentalTraitsSection"> <<include "CheatMenuMentalTraits">> </span> </div> <!-- Skills Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff922b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff922b; margin: 0 0 15px 0;">⚡ Skills</h2> <span id="skillsSection"> <<include "CheatMenuSkills">> </span> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Return to game</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Time & Date Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <!-- Current Time Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; color: #e0e0e0; font-size: 15px;"> <div> <strong style="color: #4dabf7;">Current Time:</strong><br> <span id="currentTime" style="color: #51cf66; font-size: 18px; font-weight: bold;"><<= getTimeString()>></span> </div> <div> <strong style="color: #4dabf7;">Date:</strong><br> <span id="currentDate" style="color: #ffd43b; font-size: 18px; font-weight: bold;">$dayOfWeek, Day $dayNumber</span> </div> </div> </div> <!-- Quick Time Adjustments --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Quick Time Adjustments</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+30 Minutes</div>">> <<run window.advanceTime(30)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1 Hour</div>">> <<run window.advanceTime(60)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> </div> </div> <!-- Set Specific Time --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Set Specific Time</h3> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>6 AM</div>">> <<set $timeInMinutes = 360>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>9 AM</div>">> <<set $timeInMinutes = 540>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>12 PM</div>">> <<set $timeInMinutes = 720>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #ff6b6b 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>3 PM</div>">> <<set $timeInMinutes = 900>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff8787 0%, #ff6b6b 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>6 PM</div>">> <<set $timeInMinutes = 1080>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>10 PM</div>">> <<set $timeInMinutes = 1320>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> <!-- Day Controls --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Day Controls</h3> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Next Day (8 AM)</div>">> <<set $dayNumber += 1>> <<set _currentDayIndex = $dayOrder.indexOf($dayOfWeek)>> <<set _nextDayIndex = (_currentDayIndex + 1) % 7>> <<set $dayOfWeek = $dayOrder[_nextDayIndex]>> <<if $dayOfWeek === "Monday">> <<set $weekNumber += 1>> <</if>> <<set $timeInMinutes = 480>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <<set $mayorHoursWorkedToday = 0>> <!-- Mayor salary refresh on Monday --> <<if $dayOfWeek === "Monday" && $jobs && $jobs.includes("City Mayor")>> <<if !$lastMayorSalaryRefresh>><<set $lastMayorSalaryRefresh = -1>><</if>> <<if !$mayorWeeklySalaryAvailable>><<set $mayorWeeklySalaryAvailable = 0>><</if>> <<if $lastMayorSalaryRefresh !== $dayNumber>> <<set $mayorWeeklySalaryAvailable = 1000>> <<set $lastMayorSalaryRefresh = $dayNumber>> <</if>> <</if>> <!-- Decrement daily counters --> <<if $wifiDaysRemaining && $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 1>> <</if>> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<set $busPassDaysRemaining -= 1>> <</if>> <<if $rentDaysRemaining && $rentDaysRemaining > 0>> <<set $rentDaysRemaining -= 1>> <<if $rentDaysRemaining <= 0 && $hasApartment>> <<set $hasApartment = false>> <<set $homeless = true>> <<set $wasEvicted = true>> <</if>> <</if>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #da77f2 0%, #cc5de8 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Next Week (Monday 8 AM)</div>">> <<set $weekNumber += 1>> <<set $dayOfWeek = "Monday">> <<set $dayNumber += 7>> <<set $timeInMinutes = 480>> <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> <<set $mayorHoursWorkedToday = 0>> <!-- Mayor salary refresh (always Monday) --> <<if $jobs && $jobs.includes("City Mayor")>> <<if !$lastMayorSalaryRefresh>><<set $lastMayorSalaryRefresh = -1>><</if>> <<if !$mayorWeeklySalaryAvailable>><<set $mayorWeeklySalaryAvailable = 0>><</if>> <<if $lastMayorSalaryRefresh !== $dayNumber>> <<set $mayorWeeklySalaryAvailable = 1000>> <<set $lastMayorSalaryRefresh = $dayNumber>> <</if>> <</if>> <!-- Decrement daily counters for 7 days --> <<if $wifiDaysRemaining && $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 7>> <<if $wifiDaysRemaining < 0>><<set $wifiDaysRemaining = 0>><</if>> <</if>> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<set $busPassDaysRemaining -= 7>> <<if $busPassDaysRemaining < 0>><<set $busPassDaysRemaining = 0>><</if>> <</if>> <<if $rentDaysRemaining && $rentDaysRemaining > 0>> <<set $rentDaysRemaining -= 7>> <<if $rentDaysRemaining <= 0 && $hasApartment>> <<set $hasApartment = false>> <<set $homeless = true>> <<set $wasEvicted = true>> <</if>> <</if>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDate">>$dayOfWeek, Day $dayNumber<</replace>> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Stats Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">📊 Stats</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Strength --> <div> <p style="color: #ff6b6b; margin: 0 0 8px 0; font-weight: bold;">■ Strength: <span id="statStrength"><<= setup.getTotalStat("strength")>></span></p> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.strength = 99>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> </div> <!-- Dexterity --> <div> <p style="color: #51cf66; margin: 0 0 8px 0; font-weight: bold;">■ Dexterity: <span id="statDexterity"><<= setup.getTotalStat("dexterity")>></span></p> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.dexterity = 99>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> </div> <!-- Charisma --> <div> <p style="color: #ffd43b; margin: 0 0 8px 0; font-weight: bold;">■ Charisma: <span id="statCharisma"><<= setup.getTotalStat("charisma")>></span></p> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.charisma = 99>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> </div> <!-- Intelligence --> <div> <p style="color: #4dabf7; margin: 0 0 8px 0; font-weight: bold;">■ Intelligence: <span id="statIntelligence"><<= setup.getTotalStat("intelligence")>></span></p> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 14px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 99</div>">> <<set $stats.intelligence = 99>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> </div> </div> </div> </div> <!-- Body & Appearance Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">👤 Body & Appearance</h2> <!-- Gender --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Gender: <span id="currentGender" style="color: #e0e0e0;"><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Female</div>">> <<set $bodyParts.gender = "female">> <<replace "#currentGender">><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Male</div>">> <<set $bodyParts.gender = "male">> <<replace "#currentGender">><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>><</replace>> <</link>> </div> </div> <!-- Genitals --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Genitals: <span id="currentGenitals" style="color: #e0e0e0;"><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small Penis</div>">> <<set $bodyParts.genitals = "small penis">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #5c7cfa; color: #5c7cfa; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Penis</div>">> <<set $bodyParts.genitals = "penis">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #748ffc; color: #748ffc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Big Penis</div>">> <<set $bodyParts.genitals = "big penis">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Tight Vagina</div>">> <<set $bodyParts.genitals = "tight vagina">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f06595; color: #f06595; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Vagina</div>">> <<set $bodyParts.genitals = "vagina">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e64980; color: #e64980; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Loose Vagina</div>">> <<set $bodyParts.genitals = "loose vagina">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> </div> </div> <!-- Chest Size --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Chest Size: <span id="currentChest" style="color: #e0e0e0;"><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat Masculine</div>">> <<set $bodyParts.chest = "flat masculine">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat</div>">> <<set $bodyParts.chest = "flat">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #74c0fc; color: #74c0fc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small</div>">> <<set $bodyParts.chest = "small">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #748ffc; color: #748ffc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Medium</div>">> <<set $bodyParts.chest = "medium">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #cc5de8; color: #cc5de8; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Large</div>">> <<set $bodyParts.chest = "large">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f06595; color: #f06595; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Huge</div>">> <<set $bodyParts.chest = "huge">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Giant</div>">> <<set $bodyParts.chest = "giant">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e03131; color: #e03131; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Gigantic</div>">> <<set $bodyParts.chest = "gigantic">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> </div> </div> <!-- Butt Size --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Butt Size: <span id="currentButt" style="color: #e0e0e0;"><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat Masculine</div>">> <<set $bodyParts.butt = "flat masculine">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat</div>">> <<set $bodyParts.butt = "flat">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #74c0fc; color: #74c0fc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small</div>">> <<set $bodyParts.butt = "small">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #748ffc; color: #748ffc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Medium</div>">> <<set $bodyParts.butt = "medium">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #cc5de8; color: #cc5de8; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Large</div>">> <<set $bodyParts.butt = "large">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f06595; color: #f06595; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Huge</div>">> <<set $bodyParts.butt = "huge">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Giant</div>">> <<set $bodyParts.butt = "giant">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e03131; color: #e03131; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Gigantic</div>">> <<set $bodyParts.butt = "gigantic">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> </div> </div> <!-- Skin Tone --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Skin Tone: <span id="currentSkinTone" style="color: #e0e0e0;"><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd8a8; color: #ffd8a8; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Pale</div>">> <<set $appearance.skinTone = "pale">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #b7856a; color: #b7856a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Tan</div>">> <<set $appearance.skinTone = "tan">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #8d6e63; color: #8d6e63; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Dark</div>">> <<set $appearance.skinTone = "dark">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> </div> </div> <!-- Hair Color --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Color: <span id="currentHairColor" style="color: #e0e0e0;"><<= $appearance.hairColor>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #495057; color: #868e96; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Black</div>">> <<set $appearance.hairColor = "Black">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #8d6e63; color: #8d6e63; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Brown</div>">> <<set $appearance.hairColor = "Brown">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Blonde</div>">> <<set $appearance.hairColor = "Blonde">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #fa5252; color: #fa5252; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Red</div>">> <<set $appearance.hairColor = "Red">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #dee2e6; color: #dee2e6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Platinum</div>">> <<set $appearance.hairColor = "Platinum Blonde">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> </div> </div> <!-- Hair Length --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Length: <span id="currentHairLength" style="color: #e0e0e0;"><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #5c7cfa; color: #5c7cfa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Short</div>">> <<set $appearance.hairLength = "short">> <<if $physicalTraits.includes("Long Hair")>> <<run $physicalTraits.delete("Long Hair")>> <</if>> <<if !$physicalTraits.includes("Short Hair")>> <<run $physicalTraits.push("Short Hair")>> <</if>> <<replace "#currentHairLength">><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #cc5de8; color: #cc5de8; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Long</div>">> <<set $appearance.hairLength = "long">> <<if $physicalTraits.includes("Short Hair")>> <<run $physicalTraits.delete("Short Hair")>> <</if>> <<if !$physicalTraits.includes("Long Hair")>> <<run $physicalTraits.push("Long Hair")>> <</if>> <<replace "#currentHairLength">><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>><</replace>> <</link>> </div> </div> <!-- Hair Style (Messy/Styled) --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <<if !$appearance.hairStyle>><<set $appearance.hairStyle = "messy">><</if>> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Style: <span id="currentHairStyle" style="color: #e0e0e0;"><<if $appearance.hairStyle === "styled">>Styled<<else>>Messy<</if>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Styled</div>">> <<set $appearance.hairStyle = "styled">> <<replace "#currentHairStyle">>Styled<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Messy</div>">> <<set $appearance.hairStyle = "messy">> <<replace "#currentHairStyle">>Messy<</replace>> <</link>> </div> </div> <!-- Age --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Age: <span id="currentAge" style="color: #e0e0e0;"><<= $appearance.age>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Adult</div>">> <<set $appearance.age = "Adult">> <<replace "#currentAge">><<= $appearance.age>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Mature Adult</div>">> <<set $appearance.age = "Mature Adult">> <<replace "#currentAge">><<= $appearance.age>><</replace>> <</link>> </div> </div> <!-- Name --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Name: <span id="currentName" style="color: #e0e0e0;"><<= $firstName>> <<= $lastName>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <div> <label style="color: #aaa; font-size: 14px; display: block; margin-bottom: 5px;">First Name:</label> <<textbox "_newFirstName" $firstName>> </div> <div> <label style="color: #aaa; font-size: 14px; display: block; margin-bottom: 5px;">Last Name:</label> <<textbox "_newLastName" $lastName>> </div> </div> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Update Name</div>">> <<if _newFirstName && _newFirstName.trim() !== "">> <<set $firstName = _newFirstName.trim()>> <</if>> <<if _newLastName && _newLastName.trim() !== "">> <<set $lastName = _newLastName.trim()>> <</if>> <<replace "#currentName">><<= $firstName>> <<= $lastName>><</replace>> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Housing & Tech Items Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">🏠 Housing Status</h2> <!-- Apartment Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Apartment</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #4dabf7;">Status:</strong> <span id="apartmentStatus"> <<if $hasApartment>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <br><strong style="color: #4dabf7;">Rent Days Remaining:</strong> <span id="rentDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $rentDaysRemaining || 0>></span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Apartment</div>">> <<set $hasApartment = true>> <<set $rentDaysRemaining = 90>> <<set $homeless = false>> <<replace "#apartmentStatus">> <<if $hasApartment>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <br><strong style="color: #4dabf7;">Rent Days Remaining:</strong> <span id="rentDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $rentDaysRemaining || 0>></span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Rent to 90 Days</div>">> <<set $rentDaysRemaining = 90>> <<replace "#rentDaysDisplay">><<print $rentDaysRemaining || 0>><</replace>> <</link>> </div> </div> <!-- Tech Items --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Tech Store Items</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <!-- Laptop --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #17a2b8;">💻 Laptop:</strong> <span id="laptopStatus"> <<if $hasLaptop>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Laptop</div>">> <<set $hasLaptop = true>> <<replace "#laptopStatus">> <<if $hasLaptop>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- TV --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #667eea;">📺 TV:</strong> <span id="tvStatus"> <<if $hasTV>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add TV</div>">> <<set $hasTV = true>> <<replace "#tvStatus">> <<if $hasTV>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Router --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #f39c12;">📡 Router:</strong> <span id="routerStatus"> <<if $hasRouter>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Router</div>">> <<set $hasRouter = true>> <<replace "#routerStatus">> <<if $hasRouter>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Webcam --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #e74c3c;">📷 Webcam:</strong> <span id="webcamStatus"> <<if $hasWebcam>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Webcam</div>">> <<set $hasWebcam = true>> <<replace "#webcamStatus">> <<if $hasWebcam>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Add All Tech Items Button --> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Tech Items</div>">> <<set $hasLaptop = true>> <<set $hasTV = true>> <<set $hasRouter = true>> <<set $hasWebcam = true>> <<replace "#laptopStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#tvStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#routerStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#webcamStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <</link>> </div> <!-- WiFi Service --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">WiFi Service</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #4dabf7;">WiFi Setup:</strong> <span id="wifiSetupStatus"> <<if $wifiSetupComplete>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Complete</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Setup</span> <</if>> </span> <br> <strong style="color: #4dabf7;">Service Days:</strong> <span id="wifiDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $wifiDaysRemaining || 0>></span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Complete WiFi Setup</div>">> <<set $wifiSetupComplete = true>> <<replace "#wifiSetupStatus">> <<if $wifiSetupComplete>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Complete</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Setup</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set WiFi to 90 Days</div>">> <<set $wifiDaysRemaining = 90>> <<replace "#wifiDaysDisplay">><<print $wifiDaysRemaining || 0>><</replace>> <</link>> </div> </div> </div> <!-- Music Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6347; margin: 0 0 15px 0;">🎵 Music Equipment</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <!-- Guitar --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🎸 Guitar:</strong> <span id="guitarStatus"> <<if $ownsGuitar>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Guitar</div>">> <<set $ownsGuitar = true>> <<replace "#guitarStatus">> <<if $ownsGuitar>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Electric Piano --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🎹 Electric Piano:</strong> <span id="pianoStatus"> <<if $ownsElectricPiano>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Piano</div>">> <<set $ownsElectricPiano = true>> <<replace "#pianoStatus">> <<if $ownsElectricPiano>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Microphone --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🎤 Microphone:</strong> <span id="micStatus"> <<if $ownsMicrophone>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Microphone</div>">> <<set $ownsMicrophone = true>> <<replace "#micStatus">> <<if $ownsMicrophone>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Speakers --> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #ff6347;">🔊 Speakers:</strong> <span id="speakersStatus"> <<if $ownsSpeakers>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> </span> <br> <<link "<div style='background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); color: white; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; margin-top: 8px;'>Add Speakers</div>">> <<set $ownsSpeakers = true>> <<replace "#speakersStatus">> <<if $ownsSpeakers>> <span style="color: #51cf66;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Add All Music Equipment Button --> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Music Equipment</div>">> <<set $ownsGuitar = true>> <<set $ownsElectricPiano = true>> <<set $ownsMicrophone = true>> <<set $ownsSpeakers = true>> <<replace "#guitarStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#pianoStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#micStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <<replace "#speakersStatus">><span style="color: #51cf66;"> ✓ Owned</span><</replace>> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Streaming Content Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <span id="streamingSection"> <<include "CheatMenuStreaming">> </span> </div> <!-- PrawnHub Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div id="prawnhubSection"> <<include "CheatMenuPrawnHub">> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <span id="relationshipsSection"> <<include "CheatMenuRelationships">> </span> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <span id="physicalTraitsSection"> <<include "CheatMenuPhysicalTraits">> </span> <span id="voiceTraitsSection"> <<include "CheatMenuVoiceTraits">> </span> <span id="mentalTraitsSection"> <<include "CheatMenuMentalTraits">> </span> <span id="skillsSection"> <<include "CheatMenuSkills">> </span> <!-- Special Traits Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6b9d; margin: 0 0 15px 0;">🧪 Special Traits & Skills</h2> <!-- BtestBraitBeesBigBeenore --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">BtestBraitBeesBigBeenore</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Ultimate power skill with 999 trade value and +90 to all stats</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="btestStatus"> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$skills.includes("BtestBraitBeesBigBeenore")>> <<run $skills.push("BtestBraitBeesBigBeenore")>> <</if>> <<replace "#btestStatus">> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <<run $skills.delete("BtestBraitBeesBigBeenore")>> <</if>> <<replace "#btestStatus">> <<if $skills.includes("BtestBraitBeesBigBeenore")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Were-Creature --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Were-Creature</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Powerful transformation trait with 450 trade value and +60 Strength/Dexterity</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="wereStatus"> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$physicalTraits.includes("Were-Creature")>> <<run $physicalTraits.push("Were-Creature")>> <</if>> <<replace "#wereStatus">> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $physicalTraits.includes("Were-Creature")>> <<run $physicalTraits.delete("Were-Creature")>> <</if>> <<replace "#wereStatus">> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Sunfish --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Sunfish</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Legendary aquatic skill with 500 trade value and +50 to all stats</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="sunfishStatus"> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$skills.includes("Sunfish")>> <<run $skills.push("Sunfish")>> <</if>> <<replace "#sunfishStatus">> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $skills.includes("Sunfish")>> <<run $skills.delete("Sunfish")>> <</if>> <<replace "#sunfishStatus">> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Totally not a Vampire --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Totally not a Vampire</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Definitely human trait with 450 trade value and +50 Strength/Charisma/Dexterity</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="vampireStatus"> <<if $physicalTraits.includes("Totally not a Vampire")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$physicalTraits.includes("Totally not a Vampire")>> <<run $physicalTraits.push("Totally not a Vampire")>> <</if>> <<replace "#vampireStatus">> <<if $physicalTraits.includes("Totally not a Vampire")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $physicalTraits.includes("Totally not a Vampire")>> <<run $physicalTraits.delete("Totally not a Vampire")>> <</if>> <<replace "#vampireStatus">> <<if $physicalTraits.includes("Totally not a Vampire")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> </div> <!-- Job Management Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">💼 Job Management</h2> <!-- Current Job Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Current Job:</h3> <span id="currentJob"> <<if $jobs && $jobs.length > 0>> <span style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print $jobs[0]>></span> <<else>> <span style="color: #ff6b6b; font-size: 18px; font-weight: bold;">Unemployed</span> <</if>> </span> </div> <!-- Job Selection --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Change Job:</h3> <select id="replaceJob" style="width: 100%; padding: 12px; background: #0a0a0a; color: #fff; border: 2px solid #667eea; border-radius: 8px; margin-bottom: 15px; font-size: 15px; cursor: pointer;"> <option value="">-- Select Job --</option> <option value="Unemployed">Unemployed (Value: 0)</option> <option value="Adult Store Clerk">Adult Store Clerk (Value: 20)</option> <option value="Adult Streamer">Adult Streamer (Value: 40)</option> <option value="Baker">Baker (Value: 10)</option> <option value="Barista">Barista (Value: 20)</option> <option value="Beauty Salon Stylist">Beauty Salon Stylist (Value: 30)</option> <option value="Bouncer">Bouncer (Value: 40)</option> <option value="Brothel Owner">Brothel Owner (Value: 70)</option> <option value="Brothel Worker">Brothel Worker (Value: 35)</option> <option value="Bus Driver">Bus Driver (Value: 35)</option> <option value="City Mayor">City Mayor (Value: 140)</option> <option value="Cocktail Waitress">Cocktail Waitress (Value: 55)</option> <option value="Dancing Instructor">Dancing Instructor (Value: 95)</option> <option value="Dock Worker">Dock Worker (Value: 15)</option> <option value="Ecentric Shop Worker">Ecentric Shop Worker (Value: 20)</option> <option value="Fitness Shop Clerk">Fitness Shop Clerk (Value: 25)</option> <option value="Fitness Trainer">Fitness Trainer (Value: 70)</option> <option value="Hooker">Hooker (Value: 30)</option> <option value="Mayor's Secretary">Mayor's Secretary (Value: 65)</option> <option value="Model">Model (Value: 35)</option> <option value="Porn Star">Porn Star (Value: 50)</option> <option value="Prostitute">Prostitute (Value: 30)</option> <option value="Security Guard">Security Guard (Value: 15)</option> <option value="Streamer">Streamer (Value: 20)</option> <option value="Stripper">Stripper (Value: 35)</option> <option value="Tech Store Clerk">Tech Store Clerk (Value: 20)</option> </select> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Apply Job Change</div>">> <<set _selectedJob = jQuery("#replaceJob").val()>> <<if _selectedJob && _selectedJob !== "">> <<if _selectedJob === "Unemployed">> <<set $jobs = []>> <<set $homeless = true>> <<else>> <<set $jobs = [_selectedJob]>> <<set $homeless = false>> /* Update stats to meet job requirements */ <<set _jobReqs = setup.jobRequirements[_selectedJob] || {}>> <<for _stat, _minValue range _jobReqs>> <<if $stats[_stat] < _minValue>> <<set $stats[_stat] = _minValue>> <</if>> <</for>> <</if>> <<replace "#currentJob">> <<if $jobs && $jobs.length > 0>> <span style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print $jobs[0]>></span> <<else>> <span style="color: #ff6b6b; font-size: 18px; font-weight: bold;">Unemployed</span> <</if>> <</replace>> <</if>> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
/* ---------------------------------- */ /* --- BIMBO TRAIT OVERRIDE SYSTEM --- */ /* ---------------------------------- */ <<script>> // Define the Bimbo trait override set setup.bimboTraitOverrides = { gender: "female", hairColor: "platinum blonde", chest: "gigantic", butt: "gigantic", physicalTraits: ["Curvy", "Voluptuous", "High Energy", "Relaxed", "Fashionable"], mentalTraits: ["Bimbo", "Talkative", "Flirty", "Forgetful", "Extroverted"], voiceTraits: ["Bouncy Tone"], skills: ["High Heels Proficient", "Sexually Skilled", "Modeling", "Makeup", "Hair Styling", "Social Media"], additionalMentalTraits: ["High Stamina", "Relaxed"] }; // Check if character has Bimbo trait setup.hasBimboTrait = function(character) { if (!character) return false; if (character === State.variables) { return State.variables.mentalTraits && State.variables.mentalTraits.includes("Bimbo"); } return character.mentalTraits && character.mentalTraits.includes("Bimbo"); }; // Get effective traits (considers Bimbo override) setup.getEffectiveTraits = function(character, traitType) { if (!character) return []; var isBimbo = setup.hasBimboTrait(character); if (!isBimbo) { if (character === State.variables) { var v = State.variables; if (traitType === "physical") return v.physicalTraits || []; if (traitType === "mental") return v.mentalTraits || []; if (traitType === "skills") return v.skills || []; } else { if (traitType === "physical") return character.physicalTraits || []; if (traitType === "mental") return character.mentalTraits || []; if (traitType === "skills") return character.skills || []; } return []; } var overrides = setup.bimboTraitOverrides; if (traitType === "physical") { return overrides.physicalTraits.concat(overrides.voiceTraits); } if (traitType === "mental") { return overrides.mentalTraits.concat(overrides.additionalMentalTraits); } if (traitType === "skills") { return overrides.skills; } return []; }; // Get stored (original) traits when Bimbo is active setup.getStoredTraits = function(character, traitType) { if (!character) return []; if (character === State.variables) { var v = State.variables; if (!v.bimboStoredTraits) return []; if (traitType === "physical") return v.bimboStoredTraits.physical || []; if (traitType === "mental") return v.bimboStoredTraits.mental || []; if (traitType === "skills") return v.bimboStoredTraits.skills || []; } else { if (!character.bimboStoredTraits) return []; if (traitType === "physical") return character.bimboStoredTraits.physical || []; if (traitType === "mental") return character.bimboStoredTraits.mental || []; if (traitType === "skills") return character.bimboStoredTraits.skills || []; } return []; }; // Activate Bimbo trait (stores original traits) setup.activateBimboTrait = function(character) { if (!character) return; var isPlayer = (character === State.variables); var v = isPlayer ? State.variables : character; if (!v.bimboStoredTraits) { v.bimboStoredTraits = { physical: (isPlayer ? v.physicalTraits : character.physicalTraits).slice(), mental: (isPlayer ? v.mentalTraits : character.mentalTraits).slice(), skills: (isPlayer ? v.skills : character.skills).slice(), bodyParts: { gender: (isPlayer ? v.bodyParts.gender : character.bodyParts.gender), chest: (isPlayer ? v.bodyParts.chest : character.bodyParts.chest), butt: (isPlayer ? v.bodyParts.butt : character.bodyParts.butt) // NOTE: genitals are NOT stored - Bimbo doesn't affect them }, appearance: { hairColor: (isPlayer ? v.appearance.hairColor : character.appearance.hairColor) } }; } var overrides = setup.bimboTraitOverrides; if (isPlayer) { v.bodyParts.gender = overrides.gender; v.bodyParts.chest = overrides.chest; v.bodyParts.butt = overrides.butt; v.appearance.hairColor = overrides.hairColor; v.physicalTraits = overrides.physicalTraits.concat(overrides.voiceTraits); v.mentalTraits = overrides.mentalTraits.concat(overrides.additionalMentalTraits); v.skills = overrides.skills.slice(); } else { character.bodyParts.gender = overrides.gender; character.bodyParts.chest = overrides.chest; character.bodyParts.butt = overrides.butt; character.appearance.hairColor = overrides.hairColor; character.physicalTraits = overrides.physicalTraits.concat(overrides.voiceTraits); character.mentalTraits = overrides.mentalTraits.concat(overrides.additionalMentalTraits); character.skills = overrides.skills.slice(); } }; // Deactivate Bimbo trait (restores original traits) setup.deactivateBimboTrait = function(character) { if (!character) return; var isPlayer = (character === State.variables); var v = isPlayer ? State.variables : character; if (v.bimboStoredTraits) { if (isPlayer) { v.bodyParts.gender = v.bimboStoredTraits.bodyParts.gender; v.bodyParts.chest = v.bimboStoredTraits.bodyParts.chest; v.bodyParts.butt = v.bimboStoredTraits.bodyParts.butt; v.appearance.hairColor = v.bimboStoredTraits.appearance.hairColor; v.physicalTraits = v.bimboStoredTraits.physical.slice(); v.mentalTraits = v.bimboStoredTraits.mental.slice(); v.skills = v.bimboStoredTraits.skills.slice(); } else { character.bodyParts.gender = character.bimboStoredTraits.bodyParts.gender; character.bodyParts.chest = character.bimboStoredTraits.bodyParts.chest; character.bodyParts.butt = character.bimboStoredTraits.bodyParts.butt; character.appearance.hairColor = character.bimboStoredTraits.appearance.hairColor; character.physicalTraits = character.bimboStoredTraits.physical.slice(); character.mentalTraits = character.bimboStoredTraits.mental.slice(); character.skills = character.bimboStoredTraits.skills.slice(); } delete v.bimboStoredTraits; } }; // Bimbo transformation text setup.getBimboTransformationText = function(gaining, oldTraits) { if (gaining) { return "A wave of warmth washes over you, starting at your core and radiating outward. Your thoughts feel... lighter somehow, less complicated. Worries and complex ideas seem to drift away like clouds, replaced by simpler, more pleasant thoughts. Your body tingles as it shifts - curves swelling and rounding, your chest and butt expanding to gigantic proportions. Your hair lightens to platinum blonde, catching the light beautifully. You feel bubbly, energetic, and so, so happy! Everything just feels... easier now. More fun! You giggle at how good it feels to just be pretty and carefree. Who needs all those boring old thoughts anyway? Being a bimbo is like, totally amazing!"; } else { return "Clarity crashes over you like a cold wave. Suddenly, thoughts that seemed impossibly complex before make perfect sense again. Your mind sharpens, focuses - it's like waking up from a pleasant but hazy dream. Your body shifts too, curves adjusting, hair color changing back, proportions returning to what they were. The constant bubbly happiness fades to more nuanced emotions. You remember who you were, what you cared about. The mental fog lifts completely, leaving you feeling... different. More yourself, perhaps, but also strangely aware of what you just experienced."; } }; <</script>>
/* ========================================== * NPC LOCATION SCHEDULES * Job-based system with custom overrides * ==========================================*/ /* Job to location mapping - NPCs appear here based on their primary job */ <<set setup.jobLocations = { "Unemployed": "Alley", "Streamer": "MeetNeighbors", "Adult Streamer": "MeetNeighbors", "Dancing Instructor": "DanceStudio", "Barista": "Cafe", "City Mayor": "TownHall", "Mayor's Secretary": "TownHall", "Beauty Salon Stylist": "BeautySalon", "Baker": "Bakery", "Ecentric Shop Worker": "EcentricShop", "Tech Store Clerk": "TechStore", "Adult Store Clerk": "AdultStore", "Fitness Shop Clerk": "FitnessShop", "Brothel Worker": "Brothel", "Brothel Owner": "Brothel", "Stripper": "StripClub", "Bouncer": "StripClub", "Security Guard": "Casino", "Cocktail Waitress": "Casino", "Dock Worker": "Docks", "Bus Driver": "BusStop", "Fitness Trainer": "FenRisTraining", "Mysterious Book Shop owner": "LampreyTomes", "Amateur Musician": "MeetNeighbors", "Construction Worker": "Outskirts", "Package Courier": "BusinessDistrict", "Negotiator": "BusinessDistrict", "Enforcer": "Downtown", "Clinic Assistant": "Downtown", "Data Analyst": "BusinessDistrict", "Porn Star": "VIPLounge", "Hooker": "Alley", "Social Media Influencer": "Mall", "Police Officer": "Downtown", "Black Market Dealer": "Alley" }>> /* NPC-specific location schedules - These OVERRIDE job-based locations */ <<set setup.npcLocationSchedules = { "Purple Wood": { defaultLocation: "Apartments", customSchedule: { "Tuesday": [ {location: "Downtown", start: 10, end: 12}, {location: "SeabassPark", start: 12, end: 18}, {location: "Outskirts", start: 18, end: 20}, {location: "MeetNeighbors", start: 20, end: 24}, {location: "MeetNeighbors", start: 0, end: 10} ], "Friday": [ {location: "MeetNeighbors", start: 0, end: 19}, {location: "RedLightDistrict", start: 19, end: 20}, {location: "StripClub", start: 20, end: 24} ], "Saturday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Sunday": [ {location: "MeetNeighbors", start: 0, end: 24} ] }, traitOverrides: { "Bimbo": { "Saturday": [ {location: "Mall", start: 12, end: 20}, {location: "Apartments", start: 20, end: 24}, {location: "Apartments", start: 0, end: 12} ] } } }, "Luna Snow": { defaultLocation: "MeetNeighbors", customSchedule: { "Monday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Tuesday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Wednesday": [ {location: "MeetNeighbors", start: 0, end: 10}, {location: "TrainingCenter", start: 10, end: 13}, {location: "MeetNeighbors", start: 13, end: 24} ], "Thursday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Friday": [ {location: "MeetNeighbors", start: 0, end: 13}, {location: "ChromisTunes", start: 13, end: 15}, {location: "MeetNeighbors", start: 15, end: 24} ], "Saturday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Sunday": [ {location: "MeetNeighbors", start: 0, end: 24} ] } } }>> /* Get NPC's current location based on job, custom schedule, day, time, and traits */ <<set setup.getNPCLocation = function(npcNameOrObject, dayOfWeek, hour) { var npc = typeof npcNameOrObject === 'string' ? setup.findNPCByName(npcNameOrObject) : npcNameOrObject; if (!npc) return null; var schedule = setup.npcLocationSchedules[npc.permanentId || npc.name]; // If NPC has custom schedule in new system, use that if (schedule) { // Check individual trait-based overrides FIRST (they take priority over global Bimbo) if (schedule.traitOverrides) { for (var trait in schedule.traitOverrides) { var hasTrait = false; if (npc.mentalTraits && npc.mentalTraits.includes(trait)) hasTrait = true; if (npc.physicalTraits && npc.physicalTraits.includes(trait)) hasTrait = true; if (hasTrait) { var traitSchedule = schedule.traitOverrides[trait]; if (traitSchedule[dayOfWeek]) { var daySchedule = traitSchedule[dayOfWeek]; for (var i = 0; i < daySchedule.length; i++) { var slot = daySchedule[i]; if (hour >= slot.start && hour < slot.end) { return slot.location; } } } } } } // Global Bimbo trait override (only applies if no individual override was found) var hasBimbo = false; if (npc.mentalTraits && npc.mentalTraits.includes("Bimbo")) hasBimbo = true; if (hasBimbo) { // After 8pm (20:00), go to MeetNeighbors if (hour >= 20 || hour < 6) { return "MeetNeighbors"; } // During the day, alternate between Mall and Park based on day var dayIndex = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"].indexOf(dayOfWeek); if (dayIndex % 2 === 0) { return "Mall"; } else { return "SeabassPark"; } } // Check custom schedule if (schedule.customSchedule && schedule.customSchedule[dayOfWeek]) { var daySchedule = schedule.customSchedule[dayOfWeek]; for (var i = 0; i < daySchedule.length; i++) { var slot = daySchedule[i]; if (hour >= slot.start && hour < slot.end) { return slot.location; } } } // Default location for this NPC if (schedule.defaultLocation) { return schedule.defaultLocation; } } // Fall back to job-based location var primaryJob = Array.isArray(npc.jobs) ? npc.jobs[0] : npc.jobs; return setup.jobLocations[primaryJob] || null; }>> /* Get all NPCs at a specific location */ <<set setup.getNPCsAtLocation = function(location) { var v = State.variables; var dayOfWeek = v.dayOfWeek || "Monday"; var hour = Math.floor(v.timeInMinutes / 60) % 24; var npcsHere = []; for (var i = 0; i < v.npcs.length; i++) { var npcLocation = setup.getNPCLocation(v.npcs[i], dayOfWeek, hour); if (npcLocation === location) { npcsHere.push(v.npcs[i]); } } return npcsHere; }>> /* Check if NPC uses new location system */ <<set setup.usesLocationSystem = function(npcName) { return setup.npcLocationSchedules[npcName] !== undefined; }>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💪 Opah Fitness - Closing Time</h1> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 30px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 700px; box-shadow: 0 6px 12px rgba(0,0,0,0.5);"> <p style="color: #ffc107; font-size: 26px; font-weight: bold; margin: 0 0 20px 0;">⏰ Time's Up!</p> <p style="color: #ccc; font-size: 16px; margin: 0 0 20px 0; line-height: 1.8;"> As you finish your workout, the gym staff politely inform you that it's closing time. The lights start dimming and other members are heading to the locker rooms to shower and change. </p> <p style="color: #aaa; font-size: 14px; margin: 0 0 25px 0; font-style: italic;"> "Great workout today! We're closing up for the night. Come back tomorrow between 5 AM and 9 PM!" </p> <div style="background: #1a1a1a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 25px;"> <p style="color: #ff6b6b; font-size: 14px; margin: 0; font-weight: bold;"> You gather your things and head out. </p> </div> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Leave the Gym</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<set _isWeekend = ($dayOfWeek === 0 || $dayOfWeek === 6)>> <<if _isWeekend>> <<if $currentHour >= 5 && $currentHour < 15>> <<goto "StripClubKickout">> <</if>> <<else>> <<if $currentHour >= 3 && $currentHour < 17>> <<goto "StripClubKickout">> <</if>> <</if>>